InnoDB 和 MyISAM 的核心差异在于设计目标:InnoDB 面向事务与数据安全,支持 ACID、行级锁、聚簇索引、外键和 MVCC;MyISAM 面向简单读取,仅支持表级锁、非聚簇索引、全文索引(已边缘化),无事务与崩溃恢复能力。

InnoDB 和 MyISAM 是 MySQL 最经典的两种存储引擎,核心差异不在“快慢”,而在于设计目标和适用场景:InnoDB 为事务与数据安全而生,MyISAM 为简单读取而优化。现在默认就是 InnoDB,除非有非常明确的理由,否则不必选 MyISAM。
事务支持与数据一致性
InnoDB 完全支持 ACID 事务,能回滚、保证原子性和持久性,崩溃后可通过 redo log 自动恢复;MyISAM 不支持事务,任何写入中断(如断电、崩溃)都可能导致数据文件损坏,且恢复困难。
- InnoDB 用 undo log 实现回滚,redo log 保障崩溃恢复
- MyISAM 没有日志机制,写操作直接落盘,出错即不一致
- 若业务涉及转账、订单、库存扣减等关键逻辑,必须用 InnoDB
锁机制与并发能力
InnoDB 默认行级锁,只锁被修改的行(前提是命中索引),多个用户可同时更新不同记录;MyISAM 只有表级锁,一个 UPDATE 就会锁住整张表,读写互相阻塞。
- InnoDB 行锁依赖索引,全表扫描或 WHERE 条件未走索引时,会退化为表锁
- MyISAM 的“并发插入”仅指在无读操作时允许新记录追加,不是真正并发写
- 高并发写场景下,MyISAM 容易成为性能瓶颈
索引结构与存储方式
InnoDB 使用聚簇索引,主键索引的叶子节点直接存完整行数据,数据按主键物理排序;MyISAM 是非聚簇索引,索引叶子节点只存数据文件的磁盘地址(.MYD 中的位置),数据和索引完全分离。
- InnoDB 表必须有主键(没显式定义就隐式生成),主键即聚簇依据
- MyISAM 可以没有主键,索引和数据各自独立文件(.MYI + .MYD)
- InnoDB 的 .ibd 文件同时包含数据和索引;MyISAM 对应三个文件:.frm(结构)、.MYD(数据)、.MYI(索引)
功能支持与运维特性
InnoDB 支持外键约束、MVCC(多版本并发控制)、缓冲池(Buffer Pool 缓存数据+索引);MyISAM 支持全文索引(5.6 前是独占优势)、COUNT(*) 极快(因自带行数计数器),但不支持外键,只靠 Key Cache 缓存索引。
- InnoDB 的 COUNT(*) 需扫描索引,但 8.0 后优化明显,差距已不大
- MyISAM 全文索引基本已被 Elasticsearch/Solr 替代,实际很少用
- MyISAM 表损坏后需手动 repair table,InnoDB 故障后重启即可自动恢复










