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。