NiceOffer

八股文解析

MySQL 索引:B+ 树原理与最左前缀

MySQL索引八股文数据库

MySQL 索引:B+ 树原理与最左前缀

一句话结论

  • InnoDB 用 B+ 树 做索引:矮胖、范围快、磁盘友好
  • 最左前缀:联合索引必须从最左列开始连续匹配,否则索引失效

面试标准答法

为什么选 B+ 树?

对比其他结构:

结构问题
哈希只能等值查询,不支持范围
二叉树退化成链表,树太高
B 树非叶子节点存数据,范围查询慢
B+ 树非叶子节点只存键值,叶子节点存数据且有序链表相连,范围查询极快

B+ 树特点:

  • 矮胖:千万级数据通常 3–4 层
  • 叶子节点双向链表:天然支持 ORDER BY 和范围扫描
  • 非叶子节点只存键:单个页可存更多键,减少 IO

聚簇索引 vs 二级索引

  • 聚簇索引(主键索引):叶子节点存整行数据
  • 二级索引(普通索引):叶子节点存主键值,需回表查完整行

覆盖索引:查询列都在索引里,无需回表。

最左前缀原则

联合索引 (a, b, c),索引文件按 a, b, c 排序。

有效:

  • WHERE a = 1
  • WHERE a = 1 AND b = 2
  • WHERE a = 1 AND b = 2 AND c = 3

失效或部分失效:

  • WHERE b = 2(跳过 a)
  • WHERE a = 1 AND c = 3(跳过 b,只能用到 a)
  • WHERE a LIKE '%张'(左模糊)

常见失效场景

  1. 左模糊 LIKE '%xx'
  2. 对索引列做函数/计算:WHERE DATE(create_time) = '2026-01-01'
  3. 隐式类型转换:WHERE phone = 123456(phone 是 varchar)
  4. OR 条件中有无索引列
  5. 跳过联合索引中间列

面试回答模板(30 秒版)

延伸准备

  • 能画出 (a, b, c) 联合索引的 B+ 树结构
  • 能解释 EXPLAINkey_len 怎么算
  • 能说出 ICP(索引下推)和 MRR 的作用