Skip to content

B+ 树

B 树的范围查询优化

B 树的问题是:数据分散在所有结点中,范围查询(如"找出所有 100~200 之间的记录")需要反复在树中上下移动。B+ 树把所有数据都放在叶结点,叶结点用链表串联——范围查询只需在叶结点链表上顺序扫描,这就是为什么几乎所有数据库索引都选 B+ 树。

408 考研中,B+ 树与 B 树的结构对比是高频考点,尤其关注"关键字个数与子树个数的关系"和"查找必须到叶结点"两个性质。

核心思想

B+ 树的核心特点:

  • 所有数据存储在叶子节点:内部节点仅保存索引(关键字副本),不存放实际数据记录
  • 叶子节点通过指针依次链接:形成一个有序链表,支持顺序遍历
  • 查找必须走到叶子:无论目标是否在内部节点出现,都要一路查到叶子才能获取数据

B+ 树的结构示意:

         [30 | 60]              ← 内部节点(仅索引)
        /    |    \
   [10|20] [30|50] [60|80]      ← 内部节点(仅索引)
    / | \   / | \   / | \
  [叶] → [叶] → [叶] → [叶]    ← 叶子节点(存数据,链表相连)

交互可视化

通过下方的交互动画,你可以逐步观察B+ 树的执行过程:

加载可视化中...

操作详解

B+ 树的结构

一棵 m 阶 B+ 树满足以下性质:

  1. 每个内部节点最多有 m 棵子树(m 个指针)
  2. 根节点至少有 2 棵子树(除非整棵树只有一个叶子)
  3. 除根外的内部节点至少有 ⌈m/2⌉ 棵子树
  4. 内部节点的关键字个数 = 子树个数(注意:B 树中关键字个数 = 子树个数 - 1)
  5. 所有叶子节点在同一层,包含全部关键字及指向数据记录的指针
  6. 叶子节点之间通过顺序指针链接成有序链表

关键步骤(查找过程):

  1. 从根节点开始,在当前节点的关键字中确定搜索方向
  2. 沿指针向下进入子节点,重复比较
  3. 必须到达叶子节点才能确认关键字是否存在并获取数据
  4. 若在叶子中找到目标关键字,查找成功;否则查找失败

B 树 vs B+ 树

对比项B 树B+ 树
数据存储位置所有节点都存数据仅叶子节点存数据
内部节点作用既是索引又存数据纯索引,不存数据
关键字个数n 个关键字对应 n+1 棵子树n 个关键字对应 n 棵子树
关键字是否重复关键字不重复内部节点的关键字会在叶子中再次出现
查找路径可能在任意层命中必须查到叶子层
查找性能不稳定(最好 O(1),最坏 O(log n))稳定(每次都是 O(log n))
叶子节点链表有,叶子按顺序链接
范围查询需中序遍历,效率低沿叶子链表扫描,效率高
内部节点扇出较小(节点同时存数据,占空间)较大(纯索引,单节点容纳更多关键字)

数据库索引应用

数据库选择 B+ 树而非 B 树作为索引结构,原因如下:

  1. 磁盘 I/O 更少:内部节点不存数据,同样大小的磁盘页可以容纳更多关键字,树的高度更低,磁盘读取次数更少
  2. 范围查询高效SELECT * FROM t WHERE id BETWEEN 10 AND 50 只需定位到叶子节点 10,然后沿链表顺序扫描到 50 即可
  3. 查询性能稳定:每次查询都走到叶子,路径长度一致,响应时间可预测
  4. 全表扫描友好:遍历所有叶子节点的链表即可完成全表顺序扫描,无需遍历整棵树

在 MySQL InnoDB 中,聚簇索引的叶子节点直接存放整行数据,非聚簇索引的叶子节点存放主键值(需要回表查询)。

易错:B+ 树的非叶结点不存储数据,只存储关键字和子树指针(起索引作用)。所有数据记录都在叶结点中。这与 B 树不同——B 树的每个结点都可以存储数据。

易错:B+ 树的叶结点通过链表串联(通常是双向链表),支持从任意叶结点开始的顺序遍历。这是 B+ 树支持范围查询的关键,也是与 B 树最本质的区别。

复杂度分析

操作时间复杂度说明
查找O(log n)每次都从根到叶,路径长度稳定
插入O(log n)找到叶子后插入,可能引发分裂向上传播
删除O(log n)找到叶子后删除,可能引发合并向上传播
范围查询O(log n + k)定位起点 O(log n),沿链表扫描 k 个结果

空间复杂度:O(n),所有关键字存储在叶子节点中,内部节点额外存储索引副本。

考研高频考点

  • ⭐ B+ 树与 B 树的区别(选择题/简答题必考,重点记忆对比表)
  • ⭐ B+ 树查找必须到叶子节点(判断题高频陷阱)
  • ⭐ B+ 树中内部节点关键字个数 = 子树个数(与 B 树不同,易混淆)
  • ⭐ 为什么数据库索引使用 B+ 树(简答题,从磁盘 I/O、范围查询、稳定性角度回答)
  • 叶子节点链表的作用(范围查询、顺序遍历)
  • m 阶 B+ 树非根内部节点的关键字数范围:⌈m/2⌉ ~ m

相关知识

  • B 树是 B+ 树的前身,两者的插入分裂/删除合并逻辑类似,但数据存储位置不同
  • 哈希表(拉链法)在精确匹配上更快,但不支持范围查询——这是选择树索引还是哈希索引的核心依据
  • B+ 树叶结点的顺序扫描本质上就是顺序查找,只是作用在已排序的叶链表上

真题练习

相关真题(3题)

2017Q9选择题2分

B+ 树应用:数据库索引结构中 B+ 树的特点

2016Q10选择题2分

B+ 树性质:B+ 树支持顺序查找而 B 树不支持

2009Q8选择题2分

B 树与 B+ 树区别:叶结点通过指针链接是 B+ 树特点