【面试必备】B+ 树索引详解:结构与原理一文搞懂
说到 MySQL 的核心,除了事务就是 索引。而 InnoDB 的默认索引结构,就是大名鼎鼎的 B+ 树。
👉 面试官最爱问的问题:
-
• 为什么 InnoDB 使用 B+ 树作为索引结构? -
• B+ 树和 B 树、二叉树有什么区别? -
• B+ 树索引是怎么加快查询的?
今天我们就彻底搞清楚!
一、为什么不用二叉树?
假设用二叉查找树存数据:
-
• 树高可能很大,查找需要多次磁盘 IO,效率低。 -
• 数据量大时会退化成链表。
👉 数据库追求的是 少磁盘 IO + 快速定位,二叉树显然不合适。
二、B 树 vs B+ 树
B 树(多路平衡查找树)
-
• 每个节点存 键 + 数据,叶子节点和非叶子节点都能存数据。 -
• 查找可能在中间节点结束。
B+ 树
-
• 非叶子节点只存 键(索引),不存数据。 -
• 所有数据都在叶子节点,而且叶子节点通过链表相连。
👉 好处:
-
1. IO 更稳定:查找一定走到叶子节点,树高更低。 -
2. 范围查询更快:叶子节点链表可以顺序遍历。
三、B+ 树索引的结构
📖 举例:假设我们有一棵阶数为 3 的 B+ 树:
[17 | 35]
/ | \
[3,8,12] [17,24,30] [35,40,50]
-
• 根节点/中间节点:只存键(比如 17、35),用来做导航。 -
• 叶子节点:存实际数据行的主键或指针,并且有链表相连。
👉 在 InnoDB 里,叶子节点存的是:
-
• 聚簇索引:叶子节点直接存整行数据。 -
• 二级索引:叶子节点存主键值,再通过主键回表。
四、B+ 树索引的查找过程
假设要查找 age=24:
-
1. 从根节点开始: 24 < 35→ 走中间节点[17,24,30]。 -
2. 在叶子节点二分查找 → 找到 24。 -
3. 如果是二级索引,还需要用主键再去聚簇索引回表。
👉 时间复杂度接近 O(log n),但更重要的是 树高低,磁盘 IO 少。
五、B+ 树索引的优势
-
1. 磁盘友好 -
• 节点大小一般等于一页(16KB),一次 IO 就能读一个节点。 -
• 树高很低(通常 24 层),一次查询只需 24 次 IO。 -
2. 范围查询高效 -
• 因为叶子节点链表相连,可以顺序扫描。 -
• BETWEEN、ORDER BY、GROUP BY等都能受益。 -
3. 支持排序 -
• 索引键天然有序,不需要额外排序。
六、为什么 MySQL 选 B+ 树?
-
• 二叉树太高,IO 太多。 -
• B 树数据分布在不同层,范围查询不友好。 -
• B+ 树 既能保证查询稳定,又能高效支持范围扫描,非常适合数据库。
👉 一句话总结:
B+ 树是为磁盘存储和范围查询量身定制的索引结构。
七、总结一句话
-
• 索引结构:InnoDB 默认用 B+ 树。 -
• 特点:所有数据存在叶子节点,非叶子节点只存索引,叶子节点有链表。 -
• 优势:低树高、磁盘友好、范围查询快、排序方便。
🎯 面试必备回答:
B+ 树是一种多路平衡查找树,非叶子节点只存键,所有数据存放在叶子节点,叶子节点之间有链表。
InnoDB 使用 B+ 树索引是因为它能降低树高,减少磁盘 IO,并且支持高效的范围查询。

