MySQL 的主要存储引擎及区别如下:
📊 主要存储引擎对比
| 特性 | InnoDB | MyISAM | MEMORY | ARCHIVE | CSV |
|---|---|---|---|---|---|
| 事务支持 | ✅ 支持(ACID) | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| 锁粒度 | 行级锁 | 表级锁 | 表级锁 | 行级锁 | 表级锁 |
| 外键约束 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| MVCC | ✅ 支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| 缓存机制 | 数据+索引 | 仅索引 | 内存存储 | 不缓存 | 无缓存 |
| 全文索引 | ✅(5.6+) | ✅ | ❌ | ❌ | ❌ |
| 数据压缩 | ✅ | ✅(只读表) | ❌ | ✅ 高压缩 | ❌ |
| 崩溃恢复 | ✅ 强 | ❌ 弱 | ❌ 数据丢失 | ❌ | ❌ |
| 存储限制 | 64TB | 256TB | 内存限制 | 无限制 | 系统限制 |
🔍 详细说明
1. InnoDB(默认引擎)
- 特点:支持事务、行级锁、外键约束,具有崩溃恢复能力
- 存储方式:数据按主键聚簇存储,.ibd文件(表空间)
- 适用场景:OLTP系统、需要事务保证、高并发写入
-- 创建InnoDB表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE=InnoDB;
2. MyISAM
- 特点:表级锁、不支持事务、查询速度快
- 存储方式:三个文件:.frm(结构)、.MYD(数据)、.MYI(索引)
- 适用场景:只读或读多写少、全文搜索、数据仓库
-- 创建MyISAM表
CREATE TABLE logs (id INT,content TEXT,FULLTEXT(content)
) ENGINE=MyISAM;
3. MEMORY(HEAP)
- 特点:数据存储在内存中,重启后数据丢失
- 适用场景:临时表、缓存、会话存储
-- 创建内存表
CREATE TABLE temp_session (session_id VARCHAR(32),data TEXT
) ENGINE=MEMORY;
4. ARCHIVE
- 特点:高压缩比(10:1),只支持INSERT/SELECT
- 适用场景:日志归档、历史数据存储
-- 创建归档表
CREATE TABLE historical_logs (log_date DATE,message TEXT
) ENGINE=ARCHIVE;
5. CSV
- 特点:数据以CSV格式存储,可直接用文本编辑器查看
- 适用场景:数据交换、导出导入
-- 创建CSV表
CREATE TABLE csv_data (id INT,value VARCHAR(100)
) ENGINE=CSV;
🎯 选择建议
选择InnoDB当:
- 需要事务支持(银行、电商)
- 高并发写入场景
- 需要外键约束保证数据完整性
- 需要崩溃后自动恢复
选择MyISAM当:
- 表主要是只读的(报表、统计)
- 需要全文索引(MySQL 5.6前)
- 硬件资源有限,需要节省内存
选择其他引擎当:
- MEMORY:需要极速访问的临时数据
- ARCHIVE:大量历史数据归档存储
- CSV:需要与外部系统交换数据
⚠️ 注意事项
- MySQL 8.0+默认只支持InnoDB,移除了对MyISAM的系统表使用
- 可以在同一数据库中混合使用不同引擎的表
- 更改引擎:
ALTER TABLE table_name ENGINE = InnoDB; - 可通过
SHOW ENGINES;查看支持的引擎
最佳实践:大多数现代应用应使用InnoDB,除非有特殊需求。