跳到主要内容

MySQL

MySQL(InnoDB)面试八股。按「索引 → 事务 → 锁 → 日志 → 优化」的顺序排,这也是面试里最常见的追问链路:问完索引结构必问回表,问完事务隔离必问 MVCC,问完 MVCC 必问幻读和间隙锁。

:::tip 速览 InnoDB 的几乎所有设计都能用三句话串起来:数据按主键组织成 B+ 树(聚簇索引),所以二级索引要回表;读不加锁靠多版本(MVCC),所以读写不互相阻塞;改动先写日志再刷盘(WAL),所以 redo log 决定了崩溃恢复能力。 :::

条目核心问题
架构与存储引擎一条 SQL 怎么执行?Buffer Pool、Change Buffer、页与行格式
索引与 B+ 树为什么用 B+ 树不用 B 树 / 哈希?回表、覆盖索引、最左前缀、索引失效
事务与 MVCC四种隔离级别怎么实现的?ReadView、undo 版本链、快照读
锁机制行锁 / 间隙锁 / 临键锁、意向锁、死锁检测
日志与崩溃恢复redo / undo / binlog 的分工、两阶段提交、主从复制
SQL 优化EXPLAIN 怎么读、深分页、大表 DDL、慢查询定位
表设计与范式三大范式、类型选择、索引规范、主键设计
分库分表什么时候分、分片键怎么选、跨库 JOIN / 事务 / 分页

另有一篇与 MongoDB 的逐维度对比,放在 MongoDB 模块下。

高频开场题​

InnoDB 和 MyISAM 的区别? 事务(InnoDB 支持)、锁粒度(行锁 vs 表锁)、崩溃恢复(redo log vs 无)、外键(支持 vs 不支持)、索引组织(聚簇索引 vs 非聚簇,数据与索引分离)、count(*)(InnoDB 要扫,MyISAM 存了行数)。MySQL 5.5 起默认 InnoDB。

一张表最多建几个索引? 没有硬上限意义上的答案,面试要答的是权衡:每个二级索引都是一棵独立 B+ 树,写入要同步维护,所以索引越多写越慢、空间越大。经验值是单表不超过 5~6 个,优先用联合索引覆盖多个查询,而不是给每列单独建。

自增主键 vs UUID 主键? 自增主键顺序写入,B+ 树只在右侧末端追加,页分裂少、空间紧凑;UUID 随机分布,插入位置随机,导致频繁页分裂和空间碎片,且 16 字节比 8 字节大,所有二级索引都会跟着变大(二级索引的叶子节点存的是主键值)。分布式场景要全局唯一又想有序,用雪花算法或 UUID v7,别用 v4。