B / B+ 树B-tree family
在一个节点内保存多个键,降低树高和访问次数。
- 核心约束
- 键有序,孩子覆盖划分后的键区间;具体变体存储规则不同。
- 适用问题
- 页式存储、范围索引和外存查找。
- 边界与取舍
- 节点分裂合并有成本;不同系统的 B / B+ 变体不可混同。
常见操作#
n 为记录数,B 为节点可容纳记录数的量级,k 为结果数;区分块 I/O 与 CPU 工作。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| B / B+ 树:按键查找 | 次块访问 | 节点占一个存储块且维持填充率;节点内二分查找累计 次比较。 |
| B / B+ 树:插入 / 删除 | 次块访问 | 包含分裂、借位与合并;CPU 上移动节点内元素的成本另计。 |
| B+ 树:范围扫描 | 次块访问 | 叶子按键顺序相连、记录稠密存于叶子;另有 输出工作。 |
| B 树:有序遍历 | 记录可在内部节点,需按树的中序规则访问,不能直接套 B+ 树的叶子链实现。 | |
| 有序数据批量装载 | 顺序填充叶层再构建上层的 B+ 树实现;输入若无序,排序成本另计。 |
时间与空间#
- 时间复杂度
- 点操作约 次块访问
- 存储空间
B 不能被隐藏成固定常数后又用于解释 I/O 优势;缓存、页分裂、MVCC 与 WAL 会改变实际成本。
概念与变体#
- B-tree
- 键及相关记录可分布在内部节点与叶子;实际存储格式依实现而定。
- B+ tree
- 记录通常集中在叶层,内部节点主要用于导航;叶层链接常用于范围扫描。
工程中的应用#
1 个案例 · 附源码SQLite 将表和索引组织成数据库页上的 B-tree,用一个节点容纳多个键,支持有序定位与范围遍历。
附源码片段 · 存储与数据放置
基础原理参考资料
Open Data Structures · B-Trees外存模型、节点容量及查找和更新的块访问界。
PostgreSQL 17 · B-Tree implementation真实索引的叶子、内部页、同层双向链接和页分裂。
CMU 15-445 · Tree indexesB+ 树范围扫描与有序输入的批量装载。