B树和B+树详解

在学习数据库索引、文件存储系统时,B 树和 B+ 树是绕不开的核心数据结构。它们不只是面试高频考点,更是 MySQL InnoDB 索引的底层基石。这篇博客用最通俗的语言,从零讲清 B 树、B+ 树的结构、区别与实际应用,看完就能理解为什么数据库非要用 B+ 树。

一、先搞懂:为什么需要 B 树 / B+ 树?

我们学过二叉查找树、红黑树,它们查找效率很高(O (logn)),但为啥数据库不用,反而要用 B 树 / B+ 树?

核心原因:磁盘 I/O 太慢了。数据库数据存在磁盘上,每次读取数据都要发生磁盘 I/O,而磁盘 I/O 的速度远远慢于内存操作。树的高度越高,磁盘 I/O 次数越多,查询速度就越慢。

二叉树结构容易变得很高,数据量大时磁盘 I/O 次数爆炸。因此需要一种矮胖、多路平衡的树结构,减少树的高度,从而减少磁盘 I/O,这就是 B 树和 B+ 树诞生的原因。

二、什么是 B 树?(多路平衡查找树)

B 树也叫 B- 树,是一种平衡的多路查找树,这里的 "路" 可以理解为每个节点能存储的关键字数量。

1. B 树的核心特性(m 阶 B 树)

  • 每个节点最多有 m 个子节点,最少有 ceil(m/2) 个子节点;
  • 根节点至少 2 个子节点(只有根节点时例外);
  • 每个节点中的关键字有序排列,左子树关键字 < 当前关键字 < 右子树关键字;
  • 所有叶子节点都在同一层,保证绝对平衡;
  • 每个节点既存储关键字,也存储关键字对应的数据记录;
  • 查找过程类似二分查找,找到关键字就能拿到数据。

2. B 树的查找流程

  1. 从根节点开始,加载节点到内存;
  2. 在节点内的有序关键字中二分查找,找到目标直接返回数据;
  3. 没找到就根据大小关系,进入对应的子节点重复查找;
  4. 直到叶子节点,找到或查找失败。

3. B 树的优缺点

优点:

  • 多路平衡,树高度极低,大幅减少磁盘 I/O;
  • 节点内有序,查找效率稳定;
  • 每个节点都存数据,找到关键字即可返回,适合随机查找。

缺点:

  • 每个节点都存数据,导致单个节点能存储的关键字变少,树高会相对变高;
  • 范围查询效率低,需要遍历整棵树,无法连续读取。

三、什么是 B+ 树?(B 树的升级版)

B+ 树是 B 树的优化版本,MySQL InnoDB 索引底层就是 B+ 树,也是实际工程中最常用的结构。

1. B+ 树的核心特性(m 阶 B+ 树)

  • 继承 B 树所有平衡、多路、有序的特性;
  • 非叶子节点只存储关键字,不存储真实数据,仅用于索引导航;
  • 所有数据都存储在叶子节点,叶子节点包含全部关键字和对应数据;
  • 叶子节点之间用双向链表连接,形成有序链表结构;
  • 非叶子节点的关键字会在叶子节点重复出现,作为索引;
  • 查找必须走到叶子节点才能拿到数据,查找路径长度一致。

2. B+ 树的查找流程

  1. 从根节点开始,根据关键字大小逐层向下查找;
  2. 非叶子节点只做导航,不存数据,一直走到叶子节点;
  3. 在叶子节点中找到目标数据;
  4. 范围查询时,直接遍历叶子节点的链表即可,无需回溯整棵树。

3. B+ 树相比 B 树的关键优化

  1. 非叶子节点不存数据,单个节点能存储更多关键字,树更矮,磁盘 I/O 更少;
  2. 叶子节点链表化,范围查询、排序查询极快,完美适配数据库场景;
  3. 查询稳定性更强,所有查询都必须走到叶子节点,效率均匀;
  4. 更适合磁盘存储,批量读取数据效率极高。

四、B 树 vs B+ 树:一张表看懂核心区别

表格

对比维度 B 树 B+ 树
数据存储位置 所有节点都存关键字 + 数据 仅叶子节点存数据,非叶子只存索引
叶子节点结构 独立节点,无链表 双向链表连接,有序连续
范围查询效率 低,需要遍历整棵树 极高,直接遍历链表
单个节点关键字数 较少,树相对较高 极多,树更矮
查询稳定性 有的快有的慢(可能在根节点) 所有查询路径长度一致
数据库适用性 一般,适合小数据量索引 极佳,MySQL InnoDB 标准索引

五、为什么 MySQL 选择 B+ 树做索引?

结合数据库的实际使用场景,B+ 树的优势完全碾压 B 树:

  1. 磁盘 I/O 次数最少非叶子节点只存索引,一个磁盘页能存更多关键字,树高极低,百万级数据也只有 3~4 层,I/O 极少。

  2. 范围查询极快 数据库最常用 where id > 10 and id < 100 这类范围查询,B+ 树叶子节点链表直接遍历,无需多次磁盘 I/O。

  3. 排序与分页友好 order bylimit 等操作直接依赖叶子节点的有序链表,性能极高。

  4. 查询效率稳定无论查询什么数据,都要走到叶子节点,不会出现极端慢查询。

  5. 适合批量加载磁盘预读特性可以一次性加载相邻叶子节点,充分利用磁盘顺序读写优势。

六、简单总结

  1. B 树是多路平衡查找树,解决了二叉树过高、磁盘 I/O 过多的问题;
  2. B+ 树是 B 树的优化版,非叶子节点只存索引,数据全在叶子节点且链表化;
  3. B 树适合随机查找,B+ 树适合范围查询、数据库索引场景;
  4. MySQL InnoDB 选用 B+ 树,核心是为了减少磁盘 I/O、优化范围查询、提升整体稳定性。
相关推荐
小星星闪亮登场4 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
2501_942389555 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
shylyly_6 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
白白白小纯10 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
zander25811 小时前
35. 搜索插入位置:从边界语义理解二分查找
数据结构·算法·leetcode
Chen—LSN12 小时前
C语言——深度理解指针(5)
c语言·数据结构·算法·排序算法
佳児素花痴╮14 小时前
树的基础知识与查找排序算法
数据结构·算法
郝学胜-神的一滴14 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
程序员老舅21 小时前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c