MySQL InnoDB 和 MyISAM 有什么区别?

一则或许对你有用的小广告

欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于 Spring AI + Spring Boot3.x + JDK 21...点击查看;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot3.x + JDK 17...点击查看项目介绍; 演示链接: http://116.62.199.48:7070/;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

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

表格对比

它们的主要区别如下:

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

什么时候必须用 InnoDB?

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

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

什么时候可以考虑 MyISAM?

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