七十四、【Linux数据库】MySQL数据库存储引擎
MySQL 存储引擎功能概述
核心功能
- 数据存储格式:定义数据在磁盘上的物理存储方式
- 事务支持:ACID 特性保证数据一致性
- 锁机制:控制并发访问的锁策略
- 索引结构:实现高效数据检索
- 崩溃恢复:故障后自动恢复数据一致性
引擎对比
特性 | InnoDB | MyISAM | Memory | Archive |
---|---|---|---|---|
事务支持 | ✓ | ✗ | ✗ | ✗ |
行级锁 | ✓ | ✗ | ✗ | ✗ |
外键约束 | ✓ | ✗ | ✗ | ✗ |
崩溃恢复 | ✓ | ✗ | ✗ | ✗ |
全文索引 | ✓ (5.6+) | ✓ | ✗ | ✗ |
存储限制 | 64TB | 256TB | RAM大小 | 无限制 |
适用场景 | OLTP | 只读分析 | 临时缓存 | 日志归档 |
一、存储引擎操作演示
1. 查看存储引擎
# 登录MySQL
[root@localhost ~]# mysql -u root -p
Enter password: ******# 查看支持的引擎
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+# 查看当前默认引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
2. 创建表指定引擎
# 创建InnoDB表
mysql> CREATE TABLE innodb_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=InnoDB;# 创建MyISAM表
mysql> CREATE TABLE myisam_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=MyISAM;# 创建Memory表
mysql> CREATE TABLE memory_tbl (id INT PRIMARY KEY,data VARCHAR(100)
) ENGINE=MEMORY;
3. 修改表引擎
# 修改为InnoDB
mysql> ALTER TABLE myisam_tbl ENGINE=InnoDB;# 修改为MyISAM
mysql> ALTER TABLE innodb_tbl ENGINE=MyISAM;
4. 查看表引擎信息
mysql> SHOW TABLE STATUS LIKE 'innodb_tbl'\G
*************************** 1. row ***************************Name: innodb_tblEngine: InnoDBVersion: 10Row_format: DynamicRows: 0Avg_row_length: 0Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2023-06-15 14:30:05Update_time: NULLCheck_time: NULLCollation: utf8mb4_general_ciChecksum: NULLCreate_options: Comment:
二、引擎特性演示
1. InnoDB 事务演示
# 开启事务
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_tbl VALUES (1, 'Transaction test');# 回滚事务
mysql> ROLLBACK;# 验证数据未提交
mysql> SELECT * FROM innodb_tbl;
Empty set (0.00 sec)
2. MyISAM 表修复
# 模拟表损坏
[root@localhost ~]# dd if=/dev/zero of=/var/lib/mysql/test/myisam_tbl.MYD bs=1 count=100# 检查表状态
mysql> CHECK TABLE myisam_tbl;
+-------------------+-------+----------+----------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+-------+----------+----------------------------------------------------+
| test.myisam_tbl | check | Error | Corrupt |
+-------------------+-------+----------+----------------------------------------------------+# 修复表
mysql> REPAIR TABLE myisam_tbl;
+-------------------+--------+----------+----------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+--------+----------+----------------------------------------------------+
| test.myisam_tbl | repair | status | OK |
+-------------------+--------+----------+----------------------------------------------------+
3. Memory 引擎特性
# 插入数据
mysql> INSERT INTO memory_tbl VALUES (1, 'Memory data');# 重启MySQL服务
[root@localhost ~]# systemctl restart mysqld# 验证数据丢失
mysql> SELECT * FROM memory_tbl;
Empty set (0.00 sec)
4. Archive 引擎压缩
# 创建Archive表
mysql> CREATE TABLE archive_tbl (id INT,log TEXT
) ENGINE=ARCHIVE;# 插入数据
mysql> INSERT INTO archive_tbl VALUES (1, REPEAT('Log entry ', 1000));# 查看文件大小
[root@localhost ~]# ls -lh /var/lib/mysql/test/archive_tbl.ARZ
-rw-r----- 1 mysql mysql 2.5K Jun 15 15:00 archive_tbl.ARZ
三、性能对比测试
1. 插入性能测试
# 创建测试表
mysql> CREATE TABLE insert_test_innodb (id INT) ENGINE=InnoDB;
mysql> CREATE TABLE insert_test_myisam (id INT) ENGINE=MyISAM;# 批量插入测试
mysql> SET profiling=1;
mysql> INSERT INTO insert_test_innodb SELECT * FROM seq_1_to_1000000;
mysql> INSERT INTO insert_test_myisam SELECT * FROM seq_1_to_1000000;
mysql> SHOW PROFILES;
+----------+------------+----------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------------------------------------+
| 1 | 5.23148200 | INSERT INTO insert_test_innodb SELECT ... |
| 2 | 3.87654100 | INSERT INTO insert_test_myisam SELECT ... |
+----------+------------+----------------------------------------------------+
2. 查询性能测试
# 创建索引
mysql> ALTER TABLE insert_test_innodb ADD INDEX idx_id(id);
mysql> ALTER TABLE insert_test_myisam ADD INDEX idx_id(id);# 范围查询测试
mysql> SELECT COUNT(*) FROM insert_test_innodb WHERE id BETWEEN 1000 AND 2000;
1 row in set (0.15 sec)mysql> SELECT COUNT(*) FROM insert_test_myisam WHERE id BETWEEN 1000 AND 2000;
1 row in set (0.08 sec)
命令总结表格
演示命令 | 功能描述 | 关键参数 |
---|---|---|
SHOW ENGINES | 查看支持引擎 | 无 |
SELECT @@default_storage_engine | 查看默认引擎 | 无 |
CREATE TABLE t (...) ENGINE=InnoDB | 指定引擎创建表 | ENGINE= |
ALTER TABLE t ENGINE=InnoDB | 修改表引擎 | ENGINE= |
SHOW TABLE STATUS LIKE 't' | 查看表引擎信息 | 表名 |
START TRANSACTION | 开始事务 | 无 |
ROLLBACK | 回滚事务 | 无 |
REPAIR TABLE t | 修复MyISAM表 | 表名 |
SET profiling=1 | 启用性能分析 | 无 |
SHOW PROFILES | 查看查询性能 | 无 |
功能作用详解
1. InnoDB 深度解析
核心特性
关键配置
# my.cnf 配置
innodb_buffer_pool_size=物理内存的70-80%
innodb_log_file_size=缓冲池的25%
innodb_flush_log_at_trx_commit=1 # 完全持久化
2. MyISAM 适用场景
优势场景
- 全文本搜索:
MATCH AGAINST
操作 - 数据仓库:只读或读密集型操作
- 空间数据:GIS 空间索引支持
维护命令
# 优化表(碎片整理)
OPTIMIZE TABLE myisam_tbl;# 修复索引
REPAIR TABLE myisam_tbl QUICK;
3. Memory 引擎限制
使用注意事项
- 数据丢失:服务重启后数据清空
- 表大小限制:
max_heap_table_size
控制 - 不支持BLOB/TEXT:只支持定长数据类型
临时表优化
-- 显式创建临时表
CREATE TEMPORARY TABLE temp_data ENGINE=MEMORY SELECT * FROM large_table;
4. 其他引擎应用
CSV 引擎
-- 创建CSV表
CREATE TABLE csv_data (id INT,name VARCHAR(50)
) ENGINE=CSV;-- 外部数据导入
LOAD DATA INFILE '/data/import.csv' INTO TABLE csv_data;
Archive 引擎
-- 高压缩比存储
INSERT INTO archive_logs SELECT * FROM access_log;-- 只支持插入查询
SELECT * FROM archive_logs WHERE id=100; -- 全表扫描
5. 生产环境选型
OLTP 系统
分析系统
6. 性能优化指南
InnoDB 优化
# 缓冲池优化
innodb_buffer_pool_instances=8 # 多实例减少锁争用
innodb_flush_method=O_DIRECT # 直接IO减少双缓冲# IO优化
innodb_io_capacity=2000 # SSD配置
innodb_read_io_threads=8
innodb_write_io_threads=8
MyISAM 优化
# 键缓存
key_buffer_size=512M# 并发插入
concurrent_insert=2