B+ 树是为磁盘/外存优化的平衡多路搜索树,是 MySQL InnoDB、Oracle、PostgreSQL 等数据库索引与多种文件系统的核心结构。相对 B 树,最大特点是叶子节点构成有序双向链表,范围查询极高效。

核心特性(m 阶 B+ 树)

  • 多路平衡:每个节点最多 m 个子节点,所有叶子在同一层
  • 数据分离:内部节点只存 key + 子节点指针,叶子节点才存数据
  • 叶子链表:所有叶子按 key 序由双向链表串联,支持 O(n) 范围扫描
  • 节点填充:根至少 2 个子节点;非根节点至少 ⌈m/2⌉ 个子节点

基本操作

操作流程
查找根节点二分 → 递归向下 → 叶子节点定位 key
插入找叶子 → 节点未满直接插;满则分裂,中间 key 上升至父节点
删除删叶子 key → 键数过少时向兄弟借键,否则与兄弟合并

百万级数据下树高仅 3-4 层,单次查询 IO 通常 ≤ 4 次。

B+ 树 vs B 树

特性B+ 树B 树
数据存储位置仅叶子节点所有节点
范围查询极高效(链表遍历)低效(中序回溯)
IO 效率内部节点更小、树更矮节点更大
查找路径必查至叶子,性能稳定命中位置不固定

为何数据库选 B+ 树

  • 极低磁盘 IO:节点对齐磁盘页(4–16 KB),阶数高(100+),树极矮
  • 范围查询王者BETWEEN / ORDER BY 直接遍历叶子链表
  • 全表扫描快:顺链表读,无需中序回溯
  • 性能可预测:所有操作 O(logₘN),不存在抖动

典型应用

  • 数据库索引:MySQL InnoDB、Oracle、SQL Server、PostgreSQL
  • 文件系统:NTFS、HFS+、Ext4
  • 键值存储:LevelDB、RocksDB(写路径用 LSM-Tree,读端常配 B+ 树类索引)