B+树(B+ Tree)的原理与操作
字数 811 2025-11-08 10:03:34
B+树(B+ Tree)的原理与操作
B+树是一种平衡多路搜索树,广泛应用于数据库和文件系统的索引结构中。它与B树相似,但在内部节点不存储数据,所有数据都保存在叶子节点中,且叶子节点通过指针连接形成有序链表。
一、B+树的基本性质
- 每个节点最多有m个子节点(m阶B+树)
- 根节点至少有两个子节点(除非是唯一节点)
- 内部节点(非根非叶)至少有⌈m/2⌉个子节点
- 所有叶子节点位于同一层,形成完全平衡
- 内部节点只存储键(索引键),不存储实际数据
- 叶子节点存储所有键值对,并通过指针相连
二、B+树的查找操作
查找过程从根节点开始,逐层向下比较:
- 从根节点开始,在当前节点中找到第一个大于等于目标键的位置
- 沿着对应的子节点指针向下查找
- 重复这个过程直到叶子节点
- 在叶子节点中进行顺序查找或二分查找
示例:在3阶B+树中查找键值25
根节点: [10, 20, 30] // 找到25∈[20,30),走第二个子节点
中间节点: [20, 25, 28] // 找到25∈[25,28),走第一个子节点
叶子节点: [25, 26, 27] // 找到目标键
三、B+树的插入操作
插入过程需要保持平衡,步骤包括:
- 查找合适的叶子节点位置
- 如果叶子节点有空间,直接插入并保持有序
- 如果叶子节点已满(键数=m),需要进行分裂:
a. 创建新叶子节点
b. 将原节点的键值对平均分配
c. 将新节点的最小键复制到父节点
d. 如果父节点已满,递归分裂父节点
示例:向3阶B+树(m=3)依次插入10,20,5,15
初始: [10]
插入20: [10,20] // 叶子节点未满
插入5: [5,10,20] // 叶子节点已满,需要分裂
分裂后:
根节点: [10]
叶子节点1: [5,10] → 叶子节点2: [20]
插入15: 找到应插入的叶子节点[5,10,15] // 再次分裂
最终结构:
根节点: [10,15]
叶子节点1: [5,10] → 叶子节点2: [15,20]
四、B+树的删除操作
删除时也需要保持平衡:
- 查找包含目标键的叶子节点
- 删除键值对,如果仍满足最小键数要求(≥⌈m/2⌉-1),结束
- 如果键数不足,考虑合并或重分配:
a. 如果兄弟节点有富余,借一个键
b. 否则与兄弟节点合并
c. 更新父节点的索引键
五、B+树与B树的对比优势
- 范围查询效率高:叶子节点链表支持顺序遍历
- 查询更稳定:所有查询都要走到叶子节点
- 内部节点更紧凑:相同内存可存储更多键
- 更适合磁盘I/O:节点大小通常与磁盘页对齐
B+树通过这些特性,在需要大量磁盘操作的数据存储场景中表现出色,成为数据库索引的事实标准。