1. 首页 > MySQL教程 > 正文

MySQL教程FG277-MySQL存储引擎选择

本文档风哥主要介绍MySQL存储引擎选择的实战技巧,包括各引擎特性对比、选择原则、应用场景等内容,风哥教程参考MySQL官方文档,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 存储引擎概述

存储引擎是MySQL中负责数据存储和检索的核心组件:

# 存储引擎概述

1. 存储引擎定义

存储引擎特点:
– 负责数据的存储和检索
– 提供不同的存储机制
– 可插拔式架构设计
– 每个表可选择不同引擎

存储引擎作用:
– 管理数据文件
– 实现索引机制
– 提供事务支持
– 管理锁和并发

存储引擎优势:
– 灵活选择适合的引擎
– 满足不同业务需求
– 可根据场景优化
– 支持引擎迁移

2. 查看存储引擎

查看所有支持的引擎:
mysql> SHOW ENGINES;

输出示例:
+——————–+———+—————————————————————-+————–+——+————+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+——————–+———+—————————————————————-+————–+——+————+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+——————–+———+—————————————————————-+————–+——+————+

查看默认存储引擎:
mysql> SHOW VARIABLES LIKE ‘default_storage_engine’;

输出示例:
+————————+——–+
| Variable_name | Value |
+————————+——–+
| default_storage_engine | InnoDB |
+————————+——–+

3. 查看表引擎

查看单个表的引擎:
mysql> SHOW CREATE TABLE orders\G

输出示例:
*************************** 1. row ***************************
Table: orders
Create Table: CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`customer_id` int DEFAULT NULL,
`amount` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

查看数据库所有表的引擎:
mysql> SELECT
TABLE_NAME,
ENGINE,
TABLE_ROWS,
DATA_LENGTH,
INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ‘production_db’;

输出示例:
+——————-+——–+————+————-+————-+
| TABLE_NAME | ENGINE | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH|
+——————-+——–+————+————-+————-+
| orders | InnoDB | 10000 | 10485760 | 2097152 |
| customers | InnoDB | 1000 | 1048576 | 524288 |
| logs | MyISAM | 1000000 | 52428800 | 1048576 |
+——————-+——–+————+————-+————-+

4. 设置存储引擎

创建表时指定引擎:
mysql> CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

修改表的存储引擎:
mysql> ALTER TABLE products ENGINE=MyISAM;

输出示例:
Query OK, 0 rows affected (0.10 sec)

设置默认存储引擎:
mysql> SET default_storage_engine = ‘InnoDB’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

5. 配置文件设置

设置默认引擎:
vim /etc/my.cnf

[mysqld]
default_storage_engine = InnoDB

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

验证设置:
mysql> SELECT @@default_storage_engine;

输出示例:
+————————–+
| @@default_storage_engine |
+————————–+
| InnoDB |
+————————–+

1.2 存储引擎类型

MySQL支持多种存储引擎,各有特点:

# 存储引擎类型

1. InnoDB存储引擎

特点:
– MySQL默认存储引擎
– 支持事务(ACID)
– 行级锁定
– 外键约束
– 崩溃恢复

适用场景:
– 需要事务支持的应用
– 高并发读写
– 数据完整性要求高
– 需要外键约束

创建InnoDB表:
mysql> CREATE TABLE orders_innodb (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
amount DECIMAL(10,2),
status VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_customer (customer_id)
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

InnoDB文件结构:
ls -la /var/lib/mysql/production_db/

输出示例:
-rw-r—– 1 mysql mysql 8558 Apr 1 10:00 orders_innodb.frm
-rw-r—– 1 mysql mysql 98304 Apr 1 10:00 orders_innodb.ibd

2. MyISAM存储引擎

特点:
– MySQL早期默认引擎
– 不支持事务
– 表级锁定
– 全文索引
– 空间占用小

适用场景:
– 只读或读多写少
– 全文检索
– 日志表
– 数据仓库

创建MyISAM表:
mysql> CREATE TABLE logs_myisam (
id INT PRIMARY KEY AUTO_INCREMENT,
log_time TIMESTAMP,
log_level VARCHAR(10),
message TEXT,
INDEX idx_time (log_time)
) ENGINE=MyISAM;

输出示例:
Query OK, 0 rows affected (0.01 sec)

MyISAM文件结构:
ls -la /var/lib/mysql/production_db/

输出示例:
-rw-r—– 1 mysql mysql 8558 Apr 1 10:00 logs_myisam.frm
-rw-r—– 1 mysql mysql 0 Apr 1 10:00 logs_myisam.MYD
-rw-r—– 1 mysql mysql 1024 Apr 1 10:00 logs_myisam.MYI

3. MEMORY存储引擎

特点:
– 数据存储在内存中
– 极快的访问速度
– 不持久化
– 支持HASH索引

适用场景:
– 临时数据存储
– 缓存表
– 会话管理
– 快速查找表

创建MEMORY表:
mysql> CREATE TABLE cache_memory (
key_name VARCHAR(100) PRIMARY KEY,
key_value VARCHAR(500),
expire_time TIMESTAMP
) ENGINE=MEMORY;

输出示例:
Query OK, 0 rows affected (0.01 sec)

查看内存表大小限制:
mysql> SHOW VARIABLES LIKE ‘max_heap_table_size’;

输出示例:
+———————+———-+
| Variable_name | Value |
+———————+———-+
| max_heap_table_size | 16777216 |
+———————+———-+

4. ARCHIVE存储引擎

特点:
– 高压缩比存储
– 只支持INSERT和SELECT
– 不支持索引
– 适合归档数据

适用场景:
– 历史数据归档
– 日志存储
– 审计记录
– 数据备份

创建ARCHIVE表:
mysql> CREATE TABLE history_archive (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(1000),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=ARCHIVE;

输出示例:
Query OK, 0 rows affected (0.01 sec)

插入数据:
mysql> INSERT INTO history_archive (data) VALUES (‘test data’);

输出示例:
Query OK, 1 row affected (0.00 sec)

查询数据:
mysql> SELECT * FROM history_archive;

输出示例:
+—-+———–+———————+
| id | data | created_at |
+—-+———–+———————+
| 1 | test data | 2026-04-01 10:00:00 |
+—-+———–+———————+

5. CSV存储引擎

特点:
– 数据存储为CSV格式
– 可直接编辑文件
– 不支持索引
– 适合数据交换

适用场景:
– 数据导入导出
– 与其他系统集成
– 数据交换
– 报表生成

创建CSV表:
mysql> CREATE TABLE data_csv (
id INT NOT NULL,
name VARCHAR(100),
value DECIMAL(10,2)
) ENGINE=CSV;

输出示例:
Query OK, 0 rows affected (0.01 sec)

插入数据:
mysql> INSERT INTO data_csv VALUES (1, ‘Product A’, 100.00);

输出示例:
Query OK, 1 row affected (0.00 sec)

查看CSV文件:
cat /var/lib/mysql/production_db/data_csv.CSV

输出示例:
“1”,”Product A”,”100.00″

1.3 存储引擎特性

不同存储引擎具有不同的特性:

# 存储引擎特性

1. 事务支持对比

查看引擎事务支持:
mysql> SELECT
ENGINE,
TRANSACTIONS,
XA,
SAVEPOINTS
FROM information_schema.ENGINES;

输出示例:
+——————–+————–+——+———–+
| ENGINE | TRANSACTIONS | XA | SAVEPOINTS|
+——————–+————–+——+———–+
| InnoDB | YES | YES | YES |
| MyISAM | NO | NO | NO |
| MEMORY | NO | NO | NO |
| ARCHIVE | NO | NO | NO |
+——————–+————–+——+———–+

事务测试:
— InnoDB事务
mysql> START TRANSACTION;
mysql> INSERT INTO orders_innodb VALUES (NULL, 1, 100.00, ‘pending’, NOW());
mysql> ROLLBACK;

输出示例:
Query OK, 0 rows affected (0.00 sec)

— MyISAM无事务
mysql> INSERT INTO logs_myisam VALUES (NULL, NOW(), ‘INFO’, ‘test’);
mysql> ROLLBACK;

输出示例:
Query OK, 0 rows affected (0.00 sec)
— 数据已提交,无法回滚

2. 锁机制对比

锁类型对比:
+——————-+——————+——————+
| 特性 | InnoDB | MyISAM |
+——————-+——————+——————+
| 锁粒度 | 行级锁 | 表级锁 |
| 读锁 | 共享锁 | 共享锁 |
| 写锁 | 排他锁 | 排他锁 |
| 死锁检测 | 支持 | 不支持 |
+——————-+——————+——————+

InnoDB行锁测试:
mysql> CREATE TABLE lock_test (id INT PRIMARY KEY, value INT) ENGINE=InnoDB;
mysql> INSERT INTO lock_test VALUES (1, 100), (2, 200);

— 会话1:锁定行1
mysql> START TRANSACTION;
mysql> SELECT * FROM lock_test WHERE id = 1 FOR UPDATE;

输出示例:
+—-+——-+
| id | value |
+—-+——-+
| 1 | 100 |
+—-+——-+

— 会话2:可以访问行2
mysql> SELECT * FROM lock_test WHERE id = 2;

输出示例:
+—-+——-+
| id | value |
+—-+——-+
| 2 | 200 |
+—-+——-+

3. 索引类型对比

索引支持对比:
+——————-+——————+——————+
| 索引类型 | InnoDB | MyISAM |
+——————-+——————+——————+
| B-Tree | 支持 | 支持 |
| HASH | 支持(自适应) | 不支持 |
| 全文索引 | 支持(5.6+) | 支持 |
| 空间索引 | 支持 | 支持 |
+——————-+——————+——————+

创建全文索引:
— MyISAM全文索引
mysql> CREATE TABLE articles_myisam (
id INT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT INDEX ft_idx (title, body)
) ENGINE=MyISAM;

输出示例:
Query OK, 0 rows affected (0.01 sec)

— InnoDB全文索引
mysql> CREATE TABLE articles_innodb (
id INT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT INDEX ft_idx (title, body)
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

全文搜索:
mysql> INSERT INTO articles_innodb VALUES
(1, ‘MySQL Tutorial’, ‘MySQL is a database’),
(2, ‘PostgreSQL Guide’, ‘PostgreSQL is also a database’);

mysql> SELECT * FROM articles_innodb
WHERE MATCH(title, body) AGAINST(‘database’);

输出示例:
+—-+——————+—————————–+
| id | title | body |
+—-+——————+—————————–+
| 1 | MySQL Tutorial | MySQL is a database |
| 2 | PostgreSQL Guide | PostgreSQL is also a database|
+—-+——————+—————————–+

4. 外键约束对比

外键支持对比:
+——————-+——————+——————+
| 特性 | InnoDB | MyISAM |
+——————-+——————+——————+
| 外键约束 | 支持 | 不支持 |
| 级联更新 | 支持 | 不支持 |
| 级联删除 | 支持 | 不支持 |
+——————-+——————+——————+

创建外键约束:
mysql> CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=InnoDB;

mysql> CREATE TABLE orders_fk (
id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

测试外键约束:
mysql> INSERT INTO orders_fk VALUES (1, 999, 100.00);

输出示例:
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails

5. 崩溃恢复对比

崩溃恢复能力:
+——————-+——————+——————+
| 特性 | InnoDB | MyISAM |
+——————-+——————+——————+
| 崩溃恢复 | 自动恢复 | 需要修复 |
| 重做日志 | 支持 | 不支持 |
| 回滚日志 | 支持 | 不支持 |
| 数据安全 | 高 | 较低 |
+——————-+——————+——————+

InnoDB崩溃恢复:
mysql> SHOW ENGINE INNODB STATUS\G

输出示例:
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:

LOG
Log sequence number 123456789
Log flushed up to 123456789

MyISAM修复:
mysql> REPAIR TABLE logs_myisam;

输出示例:
+————————+——–+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+——–+———-+———-+
| production_db.logs_myisam| repair| status | OK |
+————————+——–+———-+———-+

Part02-生产环境规划与建议

2.1 存储引擎选择原则

合理的存储引擎选择是数据库设计的基础:

# 存储引擎选择原则

1. 业务需求分析

需要考虑的因素:
– 是否需要事务支持
– 并发读写特点
– 数据完整性要求
– 查询模式

决策流程:
+——————-+——————+——————+
| 需求 | 推荐引擎 | 原因 |
+——————-+——————+——————+
| 需要事务 | InnoDB | ACID支持 |
| 高并发读写 | InnoDB | 行级锁 |
| 只读/读多写少 | MyISAM | 读性能好 |
| 临时数据 | MEMORY | 速度快 |
| 归档数据 | ARCHIVE | 压缩比高 |
+——————-+——————+——————+

2. 性能需求分析

读写性能对比:
mysql> — 创建测试表
mysql> CREATE TABLE perf_innodb (id INT PRIMARY KEY, data VARCHAR(100)) ENGINE=InnoDB;
mysql> CREATE TABLE perf_myisam (id INT PRIMARY KEY, data VARCHAR(100)) ENGINE=MyISAM;

写入性能测试:
mysql> INSERT INTO perf_innodb VALUES (1, ‘test’);
mysql> INSERT INTO perf_myisam VALUES (1, ‘test’);

输出示例:
Query OK, 1 row affected (0.00 sec)

读取性能测试:
mysql> SELECT * FROM perf_innodb WHERE id = 1;
mysql> SELECT * FROM perf_myisam WHERE id = 1;

输出示例:
+—-+——+
| id | data |
+—-+——+
| 1 | test |
+—-+——+

3. 数据安全需求

数据安全对比:
+——————-+——————+——————+
| 特性 | InnoDB | MyISAM |
+——————-+——————+——————+
| 崩溃恢复 | 自动 | 手动修复 |
| 数据一致性 | 高 | 较低 |
| 外键约束 | 支持 | 不支持 |
| 备份一致性 | 支持 | 需要锁表 |
+——————-+——————+——————+

高安全需求场景:
mysql> CREATE TABLE financial_records (
id INT PRIMARY KEY,
account_id INT,
amount DECIMAL(12,2),
transaction_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts(id)
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

4. 存储空间需求

存储空间对比:
mysql> SELECT
TABLE_NAME,
ENGINE,
TABLE_ROWS,
DATA_LENGTH / 1024 / 1024 AS data_mb,
INDEX_LENGTH / 1024 / 1024 AS index_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ‘production_db’;

输出示例:
+——————-+——–+————+———+———-+
| TABLE_NAME | ENGINE | TABLE_ROWS | data_mb | index_mb |
+——————-+——–+————+———+———-+
| orders_innodb | InnoDB | 10000 | 10.00 | 2.00 |
| logs_myisam | MyISAM | 10000 | 5.00 | 1.00 |
+——————-+——–+————+———+———-+

ARCHIVE压缩效果:
mysql> CREATE TABLE logs_archive ENGINE=ARCHIVE AS
SELECT * FROM logs_myisam;

输出示例:
Query OK, 10000 rows affected (0.50 sec)

5. 运维成本分析

运维复杂度对比:
+——————-+——————+——————+
| 维护项目 | InnoDB | MyISAM |
+——————-+——————+——————+
| 崩溃恢复 | 自动 | 需要REPAIR |
| 碎片整理 | OPTIMIZE TABLE | OPTIMIZE TABLE |
| 监控指标 | 丰富 | 较少 |
| 备份恢复 | 在线热备 | 需要锁表 |
+——————-+——————+——————+

2.2 存储引擎对比

详细的存储引擎特性对比:

# 存储引擎对比

1. 功能特性对比

完整功能对比表:
+——————-+——–+——–+——–+———+——–+
| 特性 | InnoDB | MyISAM | MEMORY | ARCHIVE | CSV |
+——————-+——–+——–+——–+———+——–+
| 事务支持 | YES | NO | NO | NO | NO |
| 行级锁 | YES | NO | NO | NO | NO |
| 外键 | YES | NO | NO | NO | NO |
| 全文索引 | YES | YES | NO | NO | NO |
| B-Tree索引 | YES | YES | YES | NO | NO |
| HASH索引 | YES | NO | YES | NO | NO |
| 数据缓存 | YES | NO | N/A | NO | NO |
| 崩溃恢复 | YES | NO | NO | NO | NO |
+——————-+——–+——–+——–+———+——–+

2. 性能特性对比

创建性能测试表:
mysql> CREATE TABLE perf_test_innodb (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100),
INDEX idx_data (data)
) ENGINE=InnoDB;

mysql> CREATE TABLE perf_test_myisam (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100),
INDEX idx_data (data)
) ENGINE=MyISAM;

输出示例:
Query OK, 0 rows affected (0.02 sec)

批量插入测试:
mysql> INSERT INTO perf_test_innodb (data)
SELECT CONCAT(‘data’, n) FROM
(SELECT @row := @row + 1 AS n FROM
information_schema.columns,
(SELECT @row := 0) r LIMIT 10000) t;

输出示例:
Query OK, 10000 rows affected (0.50 sec)

3. 并发性能对比

InnoDB并发测试:
mysql> — 会话1
mysql> START TRANSACTION;
mysql> UPDATE perf_test_innodb SET data = ‘updated’ WHERE id = 1;
— 不提交

mysql> — 会话2
mysql> UPDATE perf_test_innodb SET data = ‘updated2’ WHERE id = 2;
— 可以执行,行级锁

输出示例:
Query OK, 1 row affected (0.00 sec)

MyISAM并发测试:
mysql> — 会话1
mysql> INSERT INTO perf_test_myisam (data) VALUES (‘new’);
— 持有写锁

mysql> — 会话2
mysql> SELECT * FROM perf_test_myisam;
— 等待写锁释放

输出示例:
— 等待中…

4. 存储空间对比

查看表空间使用:
mysql> SELECT
TABLE_NAME,
ENGINE,
TABLE_ROWS,
DATA_LENGTH / 1024 / 1024 AS data_mb,
INDEX_LENGTH / 1024 / 1024 AS index_mb,
(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 AS total_mb
FROM information_schema.TABLES
WHERE TABLE_NAME LIKE ‘perf_test%’;

输出示例:
+——————-+——–+————+———+———-+———-+
| TABLE_NAME | ENGINE | TABLE_ROWS | data_mb | index_mb | total_mb |
+——————-+——–+————+———+———-+———-+
| perf_test_innodb | InnoDB | 10000 | 1.00 | 0.50 | 1.50 |
| perf_test_myisam | MyISAM | 10000 | 0.50 | 0.25 | 0.75 |
+——————-+——–+————+———+———-+———-+

5. 适用场景总结

场景推荐:
+——————-+——————+————————+
| 场景 | 推荐引擎 | 原因 |
+——————-+——————+————————+
| OLTP系统 | InnoDB | 事务、行锁、外键 |
| 数据仓库 | MyISAM/InnoDB | 读性能/压缩 |
| 日志系统 | MyISAM/ARCHIVE | 写性能/压缩 |
| 会话管理 | MEMORY | 速度 |
| 数据交换 | CSV | 兼容性 |
| 历史归档 | ARCHIVE | 压缩比 |
+——————-+——————+————————+

2.3 存储引擎监控

建立完善的存储引擎监控体系:

# 存储引擎监控

1. InnoDB监控

查看InnoDB状态:
mysql> SHOW ENGINE INNODB STATUS\G

输出示例:
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
=====================================
2026-04-01 10:00:00 0x7f8b1c0b4700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 60 seconds
—————–
BACKGROUND THREAD
—————–
srv_master_thread loops: 123456 srv_active, 0 srv_shutdown…
———-
SEMAPHORES
———-
OS WAIT ARRAY INFO: reservation count 12345

查看InnoDB变量:
mysql> SHOW VARIABLES LIKE ‘innodb%’;

输出示例:
+——————————————+————————+
| Variable_name | Value |
+——————————————+————————+
| innodb_buffer_pool_size | 134217728 |
| innodb_log_file_size | 50331648 |
| innodb_flush_log_at_trx_commit | 1 |
+——————————————+————————+

查看InnoDB状态变量:
mysql> SHOW STATUS LIKE ‘Innodb%’;

输出示例:
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| Innodb_buffer_pool_read_requests | 1000000 |
| Innodb_buffer_pool_reads | 1000 |
| Innodb_row_lock_waits | 50 |
+—————————————+————-+

2. MyISAM监控

查看MyISAM状态变量:
mysql> SHOW STATUS LIKE ‘Key%’;

输出示例:
+————————+——-+
| Variable_name | Value |
+————————+——-+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 107163|
| Key_blocks_used | 100 |
| Key_read_requests | 50000 |
| Key_reads | 100 |
| Key_write_requests | 1000 |
| Key_writes | 500 |
+————————+——-+

计算键缓存命中率:
mysql> SELECT
Key_read_requests,
Key_reads,
ROUND((1 – Key_reads / Key_read_requests) * 100, 2) AS hit_ratio
FROM (
SELECT
(SELECT VARIABLE_VALUE FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Key_read_requests’) AS Key_read_requests,
(SELECT VARIABLE_VALUE FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Key_reads’) AS Key_reads
) t;

输出示例:
+——————-+———-+———–+
| Key_read_requests | Key_reads| hit_ratio |
+——————-+———-+———–+
| 50000 | 100 | 99.80 |
+——————-+———-+———–+

3. 表级监控

查看表统计信息:
mysql> SELECT
TABLE_SCHEMA,
TABLE_NAME,
ENGINE,
TABLE_ROWS,
DATA_LENGTH / 1024 / 1024 AS data_mb,
INDEX_LENGTH / 1024 / 1024 AS index_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = ‘production_db’
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;

输出示例:
+————–+——————-+——–+————+———+———-+
| TABLE_SCHEMA | TABLE_NAME | ENGINE | TABLE_ROWS | data_mb | index_mb |
+————–+——————-+——–+————+———+———-+
| production_db| orders | InnoDB | 50000 | 50.00 | 10.00 |
| production_db| logs | MyISAM | 100000 | 100.00 | 20.00 |
+————–+——————-+——–+————+———+———-+

4. 性能监控

创建监控视图:
mysql> CREATE VIEW v_engine_stats AS
SELECT
ENGINE,
COUNT(*) AS table_count,
SUM(TABLE_ROWS) AS total_rows,
SUM(DATA_LENGTH) / 1024 / 1024 AS total_data_mb,
SUM(INDEX_LENGTH) / 1024 / 1024 AS total_index_mb
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN (‘mysql’, ‘information_schema’, ‘performance_schema’)
GROUP BY ENGINE;

查询监控数据:
mysql> SELECT * FROM v_engine_stats;

输出示例:
+——–+————+————+—————+—————-+
| ENGINE | table_count| total_rows | total_data_mb | total_index_mb |
+——–+————+————+—————+—————-+
| InnoDB | 10 | 100000 | 100.00 | 20.00|
| MyISAM | 5 | 500000 | 200.00 | 40.00|
+——–+————+————+—————+—————-+

5. 告警配置

创建告警存储过程:
mysql> DELIMITER //
mysql> CREATE PROCEDURE check_engine_health()
BEGIN
— 检查MyISAM表是否需要修复
SELECT TABLE_SCHEMA, TABLE_NAME, ‘MyISAM table may need repair’ AS alert
FROM information_schema.TABLES
WHERE ENGINE = ‘MyISAM’
AND TABLE_ROWS = 0
AND DATA_LENGTH > 0;

— 检查InnoDB行锁等待
SELECT ‘High row lock waits detected’ AS alert
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Innodb_row_lock_waits’
AND VARIABLE_VALUE > 100;
END //
mysql> DELIMITER ;

执行检查:
mysql> CALL check_engine_health();

输出示例:
Empty set (0.00 sec)

Part03-生产环境项目实施方案

3.1 存储引擎实施规范

制定存储引擎实施规范确保一致性:

# 存储引擎实施规范

1. 默认引擎设置

配置默认引擎:
vim /etc/my.cnf

[mysqld]
default_storage_engine = InnoDB

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

验证设置:
mysql> SELECT @@default_storage_engine;

输出示例:
+————————–+
| @@default_storage_engine |
+————————–+
| InnoDB |
+————————–+

2. 表引擎规范

创建表时明确指定引擎:
mysql> CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
amount DECIMAL(10,2),
status VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_customer (customer_id),
INDEX idx_status (status)
) ENGINE=InnoDB
COMMENT=’订单表’;

输出示例:
Query OK, 0 rows affected (0.02 sec)

引擎选择规范:
+——————-+——————+——————+
| 表类型 | 推荐引擎 | 说明 |
+——————-+——————+——————+
| 核心业务表 | InnoDB | 事务、外键 |
| 日志表 | MyISAM/InnoDB | 根据需求选择 |
| 配置表 | InnoDB | 数据安全 |
| 临时表 | MEMORY | 性能 |
| 归档表 | ARCHIVE | 压缩 |
+——————-+——————+——————+

3. 引擎变更规范

变更前检查:
mysql> — 检查表大小
mysql> SELECT TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_NAME = ‘target_table’;

输出示例:
+————+————-+————-+
| TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH|
+————+————-+————-+
| 100000 | 104857600 | 20971520 |
+————+————-+————-+

执行引擎变更:
mysql> ALTER TABLE target_table ENGINE=InnoDB;

输出示例:
Query OK, 100000 rows affected (30.00 sec)

变更后验证:
mysql> SELECT ENGINE, TABLE_ROWS FROM information_schema.TABLES
WHERE TABLE_NAME = ‘target_table’;

输出示例:
+——–+————+
| ENGINE | TABLE_ROWS |
+——–+————+
| InnoDB | 100000 |
+——–+————+

4. 权限管理规范

查看表权限:
mysql> SHOW GRANTS FOR ‘app_user’@’%’;

输出示例:
+———————————————————–+
| Grants for app_user@% |
+———————————————————–+
| GRANT SELECT, INSERT, UPDATE ON production_db.* TO … |
+———————————————————–+

设置引擎相关权限:
mysql> GRANT SELECT ON production_db.* TO ‘readonly_user’@’%’;

输出示例:
Query OK, 0 rows affected (0.01 sec)

5. 文档规范

创建引擎使用文档表:
mysql> CREATE TABLE engine_documentation (
table_name VARCHAR(100) PRIMARY KEY,
engine VARCHAR(20),
reason TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

输出示例:
Query OK, 0 rows affected (0.02 sec)

记录引擎选择原因:
mysql> INSERT INTO engine_documentation (table_name, engine, reason)
VALUES (‘orders’, ‘InnoDB’, ‘核心业务表,需要事务支持’);

输出示例:
Query OK, 1 row affected (0.01 sec)

3.2 存储引擎应用场景

存储引擎在不同场景下的应用:

# 存储引擎应用场景

1. OLTP系统场景

创建OLTP核心表:
mysql> CREATE TABLE accounts (
id INT PRIMARY KEY AUTO_INCREMENT,
account_no VARCHAR(20) UNIQUE,
balance DECIMAL(12,2) NOT NULL DEFAULT 0,
status TINYINT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

mysql> CREATE TABLE transactions (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
account_id INT,
amount DECIMAL(12,2) NOT NULL,
transaction_type ENUM(‘deposit’, ‘withdraw’, ‘transfer’),
reference_id VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_account (account_id),
INDEX idx_created (created_at),
FOREIGN KEY (account_id) REFERENCES accounts(id)
) ENGINE=InnoDB;

输出示例:
Query OK, 0 rows affected (0.02 sec)

事务操作示例:
mysql> START TRANSACTION;
mysql> UPDATE accounts SET balance = balance – 100 WHERE id = 1;
mysql> UPDATE accounts SET balance = balance + 100 WHERE id = 2;
mysql> INSERT INTO transactions (account_id, amount, transaction_type)
VALUES (1, -100, ‘transfer’), (2, 100, ‘transfer’);
mysql> COMMIT;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 日志系统场景

创建日志表:
mysql> CREATE TABLE access_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ip_address VARCHAR(45),
request_url VARCHAR(500),
http_status INT,
response_time INT,
user_agent VARCHAR(500),
INDEX idx_time (log_time),
INDEX idx_ip (ip_address)
) ENGINE=MyISAM;

输出示例:
Query OK, 0 rows affected (0.01 sec)

插入日志:
mysql> INSERT INTO access_logs (ip_address, request_url, http_status, response_time)
VALUES (‘192.168.1.1’, ‘/api/users’, 200, 50);

输出示例:
Query OK, 1 row affected (0.00 sec)

3. 缓存系统场景

创建缓存表:
mysql> CREATE TABLE session_cache (
session_id VARCHAR(64) PRIMARY KEY,
user_id INT,
data JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expire_at TIMESTAMP,
INDEX idx_expire (expire_at)
) ENGINE=MEMORY;

输出示例:
Query OK, 0 rows affected (0.01 sec)

缓存操作:
mysql> INSERT INTO session_cache (session_id, user_id, expire_at)
VALUES (UUID(), 1, DATE_ADD(NOW(), INTERVAL 30 MINUTE));

输出示例:
Query OK, 1 row affected (0.00 sec)

4. 归档系统场景

创建归档表:
mysql> CREATE TABLE order_history_archive (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
customer_id INT,
amount DECIMAL(10,2),
status VARCHAR(20),
order_date TIMESTAMP,
archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=ARCHIVE;

输出示例:
Query OK, 0 rows affected (0.01 sec)

归档数据:
mysql> INSERT INTO order_history_archive (order_id, customer_id, amount, status, order_date)
SELECT id, customer_id, amount, status, created_at
FROM orders
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR); 输出示例: Query OK, 10000 rows affected (5.00 sec) 5. 数据交换场景 创建CSV交换表: mysql> CREATE TABLE data_exchange (
id INT NOT NULL,
name VARCHAR(100),
value DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=CSV;

输出示例:
Query OK, 0 rows affected (0.01 sec)

导出数据:
mysql> INSERT INTO data_exchange (id, name, value)
SELECT id, name, price FROM products;

输出示例:
Query OK, 100 rows affected (0.01 sec)

查看CSV文件:
cat /var/lib/mysql/production_db/data_exchange.CSV

输出示例:
“1”,”Product A”,”100.00″,”2026-04-01 10:00:00″
“2”,”Product B”,”200.00″,”2026-04-01 10:00:00″

3.3 存储引擎维护

存储引擎维护是长期运营的重要工作:

# 存储引擎维护

1. 表优化

InnoDB表优化:
mysql> OPTIMIZE TABLE orders;

输出示例:
+————————+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+———-+———-+———-+
| production_db.orders | optimize | note | Table does not support optimize, doing recreate + analyze… |
| production_db.orders | optimize | status | OK |
+————————+———-+———-+———-+

MyISAM表优化:
mysql> OPTIMIZE TABLE logs_myisam;

输出示例:
+————————+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+———-+———-+———-+
| production_db.logs_myisam| optimize| status | OK |
+————————+———-+———-+———-+

2. 表分析

分析表统计信息:
mysql> ANALYZE TABLE orders;

输出示例:
+————————+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+———+———-+———-+
| production_db.orders | analyze | status | OK |
+————————+———+———-+———-+

查看表统计信息:
mysql> SHOW TABLE STATUS LIKE ‘orders’\G

输出示例:
*************************** 1. row ***************************
Name: orders
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 10000
Avg_row_length: 1024
Data_length: 10485760
Index_length: 2097152

3. 表检查

检查表完整性:
mysql> CHECK TABLE orders;

输出示例:
+————————+——-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+——-+———-+———-+
| production_db.orders | check | status | OK |
+————————+——-+———-+———-+

MyISAM表修复:
mysql> REPAIR TABLE logs_myisam;

输出示例:
+————————+——–+———-+———-+
| Table | Op | Msg_type | Msg_text |
+————————+——–+———-+———-+
| production_db.logs_myisam| repair| status | OK |
+————————+——–+———-+———-+

4. 引擎迁移

MyISAM迁移到InnoDB:
mysql> — 创建备份
mysql> CREATE TABLE logs_backup LIKE logs_myisam;
mysql> INSERT INTO logs_backup SELECT * FROM logs_myisam;

输出示例:
Query OK, 10000 rows affected (1.00 sec)

mysql> — 执行迁移
mysql> ALTER TABLE logs_myisam ENGINE=InnoDB;

输出示例:
Query OK, 10000 rows affected (5.00 sec)

mysql> — 验证迁移
mysql> SELECT ENGINE FROM information_schema.TABLES
WHERE TABLE_NAME = ‘logs_myisam’;

输出示例:
+——–+
| ENGINE |
+——–+
| InnoDB |
+——–+

5. 监控维护

创建维护脚本:
mysql> DELIMITER //
mysql> CREATE PROCEDURE maintenance_all_tables()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE t_name VARCHAR(100);
DECLARE cur CURSOR FOR
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND ENGINE = ‘InnoDB’;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;
read_loop: LOOP
FETCH cur INTO t_name;
IF done THEN
LEAVE read_loop;
END IF;

SET @sql = CONCAT(‘ANALYZE TABLE ‘, t_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;

SELECT ‘Maintenance completed’ AS result;
END //
mysql> DELIMITER ;

执行维护:
mysql> CALL maintenance_all_tables();

输出示例:
+———————-+
| result |
+———————-+
| Maintenance completed|
+———————-+

Part04-生产案例与实战讲解

4.1 InnoDB应用案例

以下是InnoDB存储引擎的实战案例:

# InnoDB应用案例

# 案例:电商订单系统

# 问题描述:
# 需要设计高并发、数据一致性要求高的订单系统

# 步骤1:创建表结构
mysql> CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

mysql> CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
status TINYINT DEFAULT 1,
INDEX idx_status (status)
) ENGINE=InnoDB;

mysql> CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT NOT NULL,
total_amount DECIMAL(12,2),
status ENUM(‘pending’, ‘paid’, ‘shipped’, ‘completed’, ‘cancelled’),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_customer (customer_id),
INDEX idx_status (status),
FOREIGN KEY (customer_id) REFERENCES customers(id)
) ENGINE=InnoDB;

mysql> CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
INDEX idx_order (order_id),
INDEX idx_product (product_id),
FOREIGN KEY (order_id) REFERENCES orders(id),
FOREIGN KEY (product_id) REFERENCES products(id)
) ENGINE=InnoDB;

# 输出示例:
# Query OK, 0 rows affected (0.02 sec)

# 步骤2:创建订单事务
mysql> DELIMITER //
mysql> CREATE PROCEDURE create_order(
IN p_customer_id INT,
IN p_product_id INT,
IN p_quantity INT
)
BEGIN
DECLARE v_stock INT;
DECLARE v_price DECIMAL(10,2);
DECLARE v_order_id INT;

START TRANSACTION;

— 检查库存
SELECT stock, price INTO v_stock, v_price
FROM products WHERE id = p_product_id FOR UPDATE;

IF v_stock < p_quantity THEN ROLLBACK; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient stock'; END IF; -- 创建订单 INSERT INTO orders (customer_id, total_amount, status) VALUES (p_customer_id, v_price * p_quantity, 'pending'); SET v_order_id = LAST_INSERT_ID(); -- 创建订单项 INSERT INTO order_items (order_id, product_id, quantity, unit_price) VALUES (v_order_id, p_product_id, p_quantity, v_price); -- 扣减库存 UPDATE products SET stock = stock - p_quantity WHERE id = p_product_id; COMMIT; SELECT v_order_id AS order_id; END // mysql> DELIMITER ;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 步骤3:测试订单创建
mysql> INSERT INTO customers (name, email) VALUES (‘Customer A’, ‘a@test.com’);
mysql> INSERT INTO products (name, price, stock) VALUES (‘Product 1’, 100.00, 10);

mysql> CALL create_order(1, 1, 2);

# 输出示例:
# +———-+
# | order_id |
# +———-+
# | 1 |
# +———-+

# 步骤4:验证数据一致性
mysql> SELECT * FROM orders WHERE id = 1;

# 输出示例:
# +—-+————-+————–+———+———————+
# | id | customer_id | total_amount | status | created_at |
# +—-+————-+————–+———+———————+
# | 1 | 1 | 200.00 | pending | 2026-04-01 10:00:00 |
# +—-+————-+————–+———+———————+

mysql> SELECT stock FROM products WHERE id = 1;

# 输出示例:
# +——-+
# | stock |
# +——-+
# | 8 |
# +——-+

4.2 MyISAM应用案例

以下是MyISAM存储引擎的实战案例:

# MyISAM应用案例

# 案例:网站访问日志系统

# 问题描述:
# 需要存储大量日志数据,主要进行写入和统计查询

# 步骤1:创建日志表
mysql> CREATE TABLE access_logs (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ip_address VARCHAR(45),
request_method VARCHAR(10),
request_url VARCHAR(500),
http_status INT,
response_time INT,
user_agent VARCHAR(500),
referer VARCHAR(500),
INDEX idx_time (log_time),
INDEX idx_ip (ip_address),
INDEX idx_status (http_status)
) ENGINE=MyISAM;

# 输出示例:
# Query OK, 0 rows affected (0.01 sec)

# 步骤2:创建全文索引
mysql> ALTER TABLE access_logs ADD FULLTEXT INDEX ft_url (request_url);

# 输出示例:
# Query OK, 0 rows affected (0.10 sec)

# 步骤3:批量插入日志
mysql> INSERT INTO access_logs
(ip_address, request_method, request_url, http_status, response_time)
VALUES
(‘192.168.1.1’, ‘GET’, ‘/api/users’, 200, 50),
(‘192.168.1.2’, ‘POST’, ‘/api/orders’, 201, 100),
(‘192.168.1.3’, ‘GET’, ‘/api/products’, 200, 30);

# 输出示例:
# Query OK, 3 rows affected (0.00 sec)

# 步骤4:统计查询
mysql> SELECT
DATE(log_time) AS log_date,
COUNT(*) AS total_requests,
AVG(response_time) AS avg_response_time,
SUM(CASE WHEN http_status = 200 THEN 1 ELSE 0 END) AS success_count
FROM access_logs
GROUP BY DATE(log_time);

# 输出示例:
# +————+—————-+——————-+—————+
# | log_date | total_requests | avg_response_time | success_count |
# +————+—————-+——————-+—————+
# | 2026-04-01 | 3 | 60.0000 | 2 |
# +————+—————-+——————-+—————+

# 步骤5:全文搜索
mysql> SELECT * FROM access_logs
WHERE MATCH(request

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息