直接回答
核心区别:InnoDB 支持事务、行级锁、外键和崩溃恢复,是 MySQL 5.5 之后的默认引擎;MyISAM 不支持事务和外键,只有表级锁,崩溃后容易损坏,主要优势是某些只读场景下开销小。
展开解析
| 维度 | InnoDB | MyISAM | |---|---|---| | 事务 | 支持(ACID) | 不支持 | | 锁粒度 | 行级锁(基于索引) | 表级锁 | | 外键 | 支持 | 不支持 | | 崩溃恢复 | redo/undo 保证 | 易损坏,需 repair | | 索引结构 | 聚簇索引,数据即主键叶子节点 | 非聚簇,索引和数据分离 |
另外:InnoDB 的 count(*) 不带条件时需要扫描(因为有 MVCC,行数不确定),MyISAM 则直接存了总行数;InnoDB 需要主键,没显式指定会生成隐藏主键。
实践中基本可以无脑选 InnoDB,MyISAM 只可能出现在遗留系统里。追问方向:为什么 InnoDB 普通索引要回表、为什么 MyISAM 表锁在高并发写下是灾难、全文索引在旧版本只有 MyISAM 支持(5.6 起 InnoDB 也支持)。