B / B+ 树B-tree family

在一个节点内保存多个键,降低树高和访问次数。

核心约束
键有序,孩子覆盖划分后的键区间;具体变体存储规则不同。
适用问题
页式存储、范围索引和外存查找。
边界与取舍
节点分裂合并有成本;不同系统的 B / B+ 变体不可混同。

常见操作#

n 为记录数,B 为节点可容纳记录数的量级,k 为结果数;区分块 I/O 与 CPU 工作。

操作时间复杂度条件与说明
B / B+ 树:按键查找O(log⁡Bn)O(\log_{B} n) 次块访问节点占一个存储块且维持填充率;节点内二分查找累计 O(log⁡n)O(\log n) 次比较。
B / B+ 树:插入 / 删除O(log⁡Bn)O(\log_{B} n) 次块访问包含分裂、借位与合并;CPU 上移动节点内元素的成本另计。
B+ 树:范围扫描O(log⁡Bn+kB)O\left(\log_B n+\frac{k}{B}\right) 次块访问叶子按键顺序相连、记录稠密存于叶子;另有 O(k)O(k) 输出工作。
B 树:有序遍历O(n)O(n)记录可在内部节点,需按树的中序规则访问,不能直接套 B+ 树的叶子链实现。
有序数据批量装载O(n)O(n)顺序填充叶层再构建上层的 B+ 树实现;输入若无序,排序成本另计。

时间与空间#

时间复杂度
点操作约 O(log⁡Bn)O(\log_{B} n) 次块访问
存储空间
O(n)O(n)

B 不能被隐藏成固定常数后又用于解释 I/O 优势;缓存、页分裂、MVCC 与 WAL 会改变实际成本。

概念与变体#

B-tree
键及相关记录可分布在内部节点与叶子;实际存储格式依实现而定。
B+ tree
记录通常集中在叶层,内部节点主要用于导航;叶层链接常用于范围扫描。

工程中的应用#

1 个案例 · 附源码
SQLite·数据库文件与页version-3.46.0

SQLite 将表和索引组织成数据库页上的 B-tree,用一个节点容纳多个键,支持有序定位与范围遍历。

附源码片段 · 存储与数据放置
基础原理参考资料

Open Data Structures · B-Trees外存模型、节点容量及查找和更新的块访问界。

PostgreSQL 17 · B-Tree implementation真实索引的叶子、内部页、同层双向链接和页分裂。

CMU 15-445 · Tree indexesB+ 树范围扫描与有序输入的批量装载。

13 个概念