深蓝黑背景品牌封面:左侧大标题「存储引擎怎么选」,副标题「InnoDB 凭什么成为默认」;右侧原创装饰——数据库圆柱体剖开为上下两层,上层 SQL 层、下层标注可插拔的引擎层,InnoDB 引擎块高亮卡入槽位,MyISAM 块虚线置于一旁;左上标注「经典题解析 · 数据库」,右上标注「Day 09 · 10-07」 图 1:本文封面,点明「可插拔引擎层」与 InnoDB 的默认地位。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料,与任何公司的当前招聘无关。题面只有一句话:MySQL 的存储引擎有哪几种,怎么选?

这道题的淘汰线划得很隐蔽。背出 InnoDB、MyISAM、Memory、Archive 四五个名字,只能算及格边缘;面试官真正想听的是:你能不能说清 InnoDB 和 MyISAM 差在哪几个维度,以及为什么今天建新表几乎不需要犹豫。

核心结论:先记住一句——MySQL 是「SQL 层 + 可插拔引擎层」的两层结构,同一张库里不同的表可以用不同的引擎。

想知道当前服务器支持哪些引擎,一条 SHOW ENGINES 就能看到,输出里 Support 列标 DEFAULT 的那行就是默认引擎。选型问题因此不是「这个库用什么引擎」,而是「这张表该用哪个引擎」。

InnoDB 与 MyISAM 的对比,沿四个维度展开。

维度一:事务。 InnoDB 是事务安全引擎,完整支持 ACID:提交、回滚、崩溃恢复一应俱全,背后靠 undo log 支撑回滚、redo log 支撑持久化。MyISAM 不支持事务,一批写入中途失败,就留下半截已写、半截没写的数据,正确性全靠应用自己兜。

维度二:锁粒度。 InnoDB 用行级锁,并发写不同的行互不阻塞,读写之间还能靠 MVCC 的一致性非锁定读互不打扰。MyISAM 只有表级锁,一个写请求锁住整张表,其他读写全得排队——读多写少还能忍,写入一多就成了瓶颈。

维度三:崩溃恢复。 InnoDB 宕机重启后自动重放 redo log,把已提交的事务追平。MyISAM 崩溃后表可能损坏,得人工检查修复,恢复时间与表大小成正比。

维度四:索引结构。 InnoDB 用聚簇索引,主键索引的叶子节点直接挂整行数据,按主键查一次到位;二级索引叶子存主键值,再回表一次。MyISAM 是非聚簇索引,索引叶子存的是行指针,数据和索引分两个文件,按主键查也得多跳一次。

InnoDB 凭什么成为默认?

把四个维度合起来看就明白了:在线业务的核心诉求是并发写不互相堵、事务保证正确、宕机不丢已提交的数据——这三点 MyISAM 一条都满足不了。所以官方文档的立场非常直接:InnoDB 是默认也是最通用的引擎,除非有特殊用途,否则建表都该用它;MySQL 8.4 里 CREATE TABLE 不写引擎,建出来的就是 InnoDB 表。

MyISAM 和其他引擎还剩哪些角落?

MyISAM 的官方定位是只读或读多写极少的工作负载,比如静态数据、数据仓库类的查询场景,它的表空间占用更小。Memory 引擎把数据全放内存里,查找飞快,但重启即丢,只适合临时计算这类「丢了无所谓」的数据。Archive 是压缩的归档引擎,只适合写入后极少再读的历史数据与审计日志。另外还有 CSV(导入导出交换用)、Blackhole(写了就丢,复制链路里当中继用)等专用引擎。它们的共同点是:都是「特殊用途」,不是通用候选。

对比图:四个维度对比 InnoDB 与 MyISAM。事务:InnoDB 完整支持 ACID 事务(undo log 回滚、redo log 持久化),MyISAM 不支持事务,写入中途失败就留下半截数据。锁粒度:InnoDB 行级锁,并发写不同行互不阻塞;MyISAM 只有表级锁,一个写请求锁全表,并发读写互相排队。崩溃恢复:InnoDB 靠 redo log 做崩溃恢复,断电后自动重放;MyISAM 崩溃后表可能损坏,需要人工修复。索引结构:InnoDB 是聚簇索引,主键叶子直接挂整行数据;MyISAM 是非聚簇索引,叶子存行指针,另查一次数据文件。右侧结论区解释 InnoDB 成为默认引擎的原因:OLTP 业务的核心诉求是并发写、事务正确性、宕机不丢数据,三点 MyISAM 全都不满足。MyISAM 仅剩的适用角落:只读或极少写的静态数据、压缩表做归档查询。底部提示:还有 Memory(内存表、重启即丢、适合临时计算)、Archive(只插不查改的归档日志)等专用引擎,选型先看写入特征与一致性要求 图 2:四维对比与 InnoDB 成为默认的原因。

可能的追问。

「既然 InnoDB 全面占优,MyISAM 为什么还活着?」历史存量加上只读场景下更小的存储开销。「Memory 引擎这么快,为什么不把热表都换过去?」它同样是表级锁,且数据不落盘,容量受内存限制,定位本就是临时数据。「同一张表能中途换引擎吗?」可以,ALTER TABLE 换引擎会重建整张表,大表要评估锁表与耗时。

易错点清单。

一,把「MySQL 的引擎」说成全局单选,不知道引擎是表级设置、一个库里可以混用。二,只说 InnoDB「支持事务」,讲不出 undo log、redo log 各管什么。三,以为 MyISAM 只是「不支持事务的 InnoDB」,漏掉表级锁、无崩溃恢复、非聚簇索引三处硬差异。四,面试里推荐 Memory 存业务热数据,忘了它重启即丢、同样是表级锁。

回到面试现场,建议的答题节奏:一句话点出可插拔架构与 SHOW ENGINES,然后沿事务、锁、恢复、索引四个维度对比 InnoDB 与 MyISAM,顺势推出默认引擎的结论,最后用 Memory、Archive 的特殊用途收尾。这个顺序本身就是「从机制到选型」的完整推理,比背结论高一个档次。

你维护的系统里还有跑在 MyISAM 上的表吗?是历史包袱还是真的只读场景?欢迎聊聊。