MySQL 为什么用 B+ 树做索引?

后端开发第 11 / 13 题答题框架
参考思路:对比 hash/二叉树/B 树:磁盘 IO 次数(树高)→范围查询友好→叶子节点链表。顺带讲聚簇/非聚簇与回表。

五个经典回答示范

回答一 · 校招应届版

B+ 树的优势有两个:一是树矮胖,每个节点是一个页,一次 IO 读一整页关键字,千万级数据高度才三四层,磁盘 IO 次数少;二是叶子节点串成有序链表,范围查询顺着链表扫即可,而哈希索引不支持范围。对比二叉树:数据倾斜时退化成链表;对比 B 树:非叶子节点也存数据,单页放的键少树更高。

回答二 · 1-3年经验版

我会顺着 B+ 树讲聚簇索引:InnoDB 主键索引的叶子直接存整行,二级索引叶子存主键值,所以二级索引查询可能回表,覆盖索引直接在二级索引里拿齐字段避免回表。实践上我用这个原理解释过为什么 select * 慢、为什么联合索引要把高区分度列放前面、为什么用自增主键避免页分裂。

回答三 · 资深版

我从存储引擎的页结构讲:16KB 页、页内有序数组加页目录二分、层间指针;插入引发页分裂与合并,自增主键顺序写入最友好,随机 UUID 导致写放大。查询成本模型:一次 B+ 树查找等于树高次 IO,buffer pool 命中则免 IO,所以热点页常驻时千万级表也能毫秒返回。索引设计是 IO 次数与写入维护成本的平衡。

回答四 · 追问应对

追问『为什么不用红黑树』:二叉结构树高 log2n 太深,一千万数据二十多层 IO;『为什么不用哈希』:等值快但范围与排序无能为力,Memory 引擎支持可见一斑;『联合索引 (a,b,c) 查 b 能用吗』:不能,不满足最左前缀,但 (a,b) 查 a 走最左。

回答五 · 反面示范

『B+ 树就是平衡二叉树的升级版,查询是 logn,所以索引快,具体为什么不用二叉树没研究过,反正数据库都这么用。』——点评:没说出磁盘 IO 与扇出这个本质区别;『反正都这么用』不是技术论证。索引是后端必考核心,这题答浅了后面会连环失分。

怎么练这道题
  1. 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
  2. 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
  3. 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。

这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。

开始限时演练