MySQL InnoDB 和 MyISAM 有什么区别?

在 MySQL 5.5 版本之前,MyISAM 是默认存储引擎;5.5 版本之后,InnoDB 成为了默认的存储引擎。

表格对比

它们的主要区别如下:

特性维度InnoDBMyISAM
事务支持✅ 完整支持(ACID)❌ 不支持
锁机制行级锁(默认),支持较高并发表级锁,并发受限
外键约束✅ 支持❌ 不支持
索引结构聚簇索引(主键索引)非聚簇索引
数据与索引存储数据文件即索引文件数据与索引分离存储
缓存机制数据和索引都缓存仅缓存索引
数据恢复支持崩溃后自动恢复崩溃后易损坏
全文索引✅ 5.6+支持(之前版本不支持)✅ 支持(较早版本)

什么时候必须用 InnoDB?

当你的服务有如下需求,就必须使用 InnoDB 存储引擎:

  • 有更新操作且需要并发控制;
  • 数据不能丢失的关键业务;
  • 需要事务保证的一致性场景;
  • 表之间有外键关联;

什么时候可以考虑 MyISAM?

  • 只读表或临时表,如数据快照;
  • 读频率远高于写频率(100:1 以上);
  • 不需要事务,可以接受数据不一致风险;
  • COUNT(*) 操作非常频繁且表很大;
  • 磁盘空间紧张(MyISAM 压缩表节省空间);