B + 树:多路搜索树的优化变体与数据库索引核心
B + 树是 B - 树的改进版本,作为一种多路平衡搜索树,它在 B - 树的基础上强化了对范围查询的支持和存储效率,成为数据库索引(如 MySQL InnoDB、PostgreSQL)和文件系统的核心数据结构。其设计充分适配磁盘 IO 特性,通过有序的叶子节点链表和集中存储的数据,实现高效的单点查询和范围查询。
B + 树的核心特点
m 阶 B + 树(m 为阶数,即节点最多的子节点数)具有以下关键特性:
- 节点结构:
- 每个非叶节点(索引节点)最多有
m个子节点,存储m个关键字(用于索引子节点范围)。 - 非根节点的关键字数量
k满足:⌈m/2⌉ ≤ k ≤ m(⌈m/2⌉为向上取整,保证节点不过于稀疏)。
- 每个非叶节点(索引节点)最多有
- 数据存储:
- 所有实际数据(记录)仅存储在叶子节点,非叶节点仅作为索引(不存数据)。
- 叶子节点按关键字大小有序排列,且相邻叶子节点通过双向链表连接(形成有序链表),便于范围查询。
- 平衡性:
- 所有叶子节点位于同一层,保证查询效率稳定(最坏情况与平均情况性能一致)。
示例:3 阶 B + 树结构
1 | [10, 20] // 非叶节点(索引节点):2个关键字,3个子节点 |
- 非叶节点
[10,20]的关键字用于划分范围:左子节点存储≤10 的记录,中间存储 10~20 的记录,右子节点存储≥20 的记录。 - 叶子节点
[5,10]、[15,20]、[25,30]通过指针串联,支持从 5 到 30 的连续范围查询。
B + 树的插入操作
B + 树的插入仅在叶子节点进行,插入后需保持节点有序和平衡性,核心处理 “节点溢出”(关键字数量超过m)的情况。
