MySQL 两大核心存储引擎 · 架构原理 · 核心区别 · 选型指南
面向读多写少的简单场景,设计以性能和紧凑为目标,不支持事务、外键、行锁。 全表级锁机制使并发写性能极差,适合数据仓库、统计报表等读密集场景。
生产环境首选,支持完整事务(ACID)、行级锁、外键约束、MVCC, 崩溃恢复能力强。适合高并发 OLTP 场景,是绝大多数互联网业务的标准选择。
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事务支持 | ✗ 不支持 | ✓ ACID 完整 |
| 锁粒度 | 表级锁(读共享/写独占) | 行级锁(默认) |
| 外键约束 | ✗ 不支持 | ✓ 支持 |
| MVCC | ✗ 不支持 | ✓ 支持 |
| 崩溃恢复 | 弱(需修复) | 强(Redo Log) |
| 全文索引 | ✓ 原生支持 | ✓ 5.6+ 支持 |
| COUNT(*) 性能 | 极快(存储总数) | 需全表扫描 |
| 索引类型 | 非聚簇索引 | 聚簇索引(主键) |
| 数据存储 | .MYD(数据)+ .MYI(索引) | .ibd(数据+索引合并) |
| 内存缓存 | 仅缓存索引 | 数据 + 索引均缓存(Buffer Pool) |
| 并发写入 | 差(表锁阻塞) | 优秀(行锁并发) |
| 适用场景 | 读多写少 / 统计 / 归档 | 高并发 OLTP / 金融 / 业务系统 |
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 | 性能最高,一致性最差 |
| READ COMMITTED | ✓ 解决 | 可能 | 可能 | Oracle 默认级别 |
| REPEATABLE READ ★ | ✓ 解决 | ✓ 解决 | 大部分解决 | MySQL/InnoDB 默认,Next-Key Lock 防幻读 |
| SERIALIZABLE | ✓ 解决 | ✓ 解决 | ✓ 解决 | 串行执行,并发最差 |
| 文件 | MyISAM | InnoDB |
|---|---|---|
| 数据文件 | .MYD(行数据) | .ibd(数据+索引合并) |
| 索引文件 | .MYI(单独存放) | 包含在 .ibd 内 |
| 表定义 | .frm | .frm(8.0 合并进 .ibd) |
| 事务日志 | 无 | ib_logfile0/1(Redo Log) |
| 回滚日志 | 无 | ibdata1 中的 Undo Log |
| 文件碎片 | DELETE 产生空洞,需 OPTIMIZE | 页管理,碎片相对较少 |
新项目默认使用 InnoDB,无需考虑 MyISAM。
MySQL 5.5 起官方已将 InnoDB 设为默认引擎,5.6 起 InnoDB 也支持全文索引,MyISAM 的最后优势已基本消失。
InnoDB 的行级锁、MVCC、事务、崩溃恢复能力是现代生产系统的基本要求。
MyISAM 的最后价值:
系统表(mysql.* 元数据表)少量使用 MyISAM,以及极少数不需要任何事务保证的纯只读统计场景。