八股文解析
MySQL 索引:B+ 树原理与最左前缀
MySQL 索引:B+ 树原理与最左前缀
一句话结论
- InnoDB 用 B+ 树 做索引:矮胖、范围快、磁盘友好
- 最左前缀:联合索引必须从最左列开始连续匹配,否则索引失效
面试标准答法
为什么选 B+ 树?
对比其他结构:
| 结构 | 问题 |
|---|---|
| 哈希 | 只能等值查询,不支持范围 |
| 二叉树 | 退化成链表,树太高 |
| B 树 | 非叶子节点存数据,范围查询慢 |
| B+ 树 | 非叶子节点只存键值,叶子节点存数据且有序链表相连,范围查询极快 |
B+ 树特点:
- 矮胖:千万级数据通常 3–4 层
- 叶子节点双向链表:天然支持
ORDER BY和范围扫描 - 非叶子节点只存键:单个页可存更多键,减少 IO
聚簇索引 vs 二级索引
- 聚簇索引(主键索引):叶子节点存整行数据
- 二级索引(普通索引):叶子节点存主键值,需回表查完整行
覆盖索引:查询列都在索引里,无需回表。
最左前缀原则
联合索引 (a, b, c),索引文件按 a, b, c 排序。
有效:
WHERE a = 1WHERE a = 1 AND b = 2WHERE a = 1 AND b = 2 AND c = 3
失效或部分失效:
WHERE b = 2(跳过 a)WHERE a = 1 AND c = 3(跳过 b,只能用到 a)WHERE a LIKE '%张'(左模糊)
常见失效场景
- 左模糊
LIKE '%xx' - 对索引列做函数/计算:
WHERE DATE(create_time) = '2026-01-01' - 隐式类型转换:
WHERE phone = 123456(phone 是 varchar) OR条件中有无索引列- 跳过联合索引中间列
面试回答模板(30 秒版)
延伸准备
- 能画出
(a, b, c)联合索引的 B+ 树结构 - 能解释
EXPLAIN中key_len怎么算 - 能说出
ICP(索引下推)和MRR的作用