B+树
B+树
基本概念
- B+树是B树的一种变形,专门为磁盘存储和数据库系统设计的平衡多路搜索树
- 关键特征
- 所有数据都储存在叶子节点
- 内部节点只存储键值,不存储数据
- 叶子节点之间用链表连接
- 支持高效的范围查询
B树的结构特点
示意图
graph TD
subgraph "B+树结构示例 (m=4)"
A["根节点
[30, 60]"] B["内部节点
[10, 20]"] C["内部节点
[40, 50]"] D["内部节点
[70, 80]"] E["叶子节点
[5, 8, 10]
data"] F["叶子节点
[15, 18, 20]
data"] G["叶子节点
[25, 28, 30]
data"] H["叶子节点
[35, 38, 40]
data"] I["叶子节点
[45, 48, 50]
data"] J["叶子节点
[55, 58, 60]
data"] K["叶子节点
[65, 68, 70]
data"] L["叶子节点
[75, 78, 80]
data"] M["叶子节点
[85, 88, 90]
data"] A --> B A --> C A --> D B --> E B --> F B --> G C --> H C --> I C --> J D --> K D --> L D --> M E -.-> F F -.-> G G -.-> H H -.-> I I -.-> J J -.-> K K -.-> L L -.-> M end style A fill:#ffcccc style B fill:#ffffcc style C fill:#ffffcc style D fill:#ffffcc style E fill:#ccffcc style F fill:#ccffcc style G fill:#ccffcc style H fill:#ccffcc style I fill:#ccffcc style J fill:#ccffcc style K fill:#ccffcc style L fill:#ccffcc style M fill:#ccffcc
[30, 60]"] B["内部节点
[10, 20]"] C["内部节点
[40, 50]"] D["内部节点
[70, 80]"] E["叶子节点
[5, 8, 10]
data"] F["叶子节点
[15, 18, 20]
data"] G["叶子节点
[25, 28, 30]
data"] H["叶子节点
[35, 38, 40]
data"] I["叶子节点
[45, 48, 50]
data"] J["叶子节点
[55, 58, 60]
data"] K["叶子节点
[65, 68, 70]
data"] L["叶子节点
[75, 78, 80]
data"] M["叶子节点
[85, 88, 90]
data"] A --> B A --> C A --> D B --> E B --> F B --> G C --> H C --> I C --> J D --> K D --> L D --> M E -.-> F F -.-> G G -.-> H H -.-> I I -.-> J J -.-> K K -.-> L L -.-> M end style A fill:#ffcccc style B fill:#ffffcc style C fill:#ffffcc style D fill:#ffffcc style E fill:#ccffcc style F fill:#ccffcc style G fill:#ccffcc style H fill:#ccffcc style I fill:#ccffcc style J fill:#ccffcc style K fill:#ccffcc style L fill:#ccffcc style M fill:#ccffcc
节点结构
|
|
B+树的性质定义
阶数(Order)的定义
- 对于m阶B+树
- 根节点:至少有2个子节点(非叶子根节点)
- 内部节点:至少有$\lceil m/2 \rceil$个子节点,至多有m个子节点
- 叶子节点:至少有$\lceil m/2 \rceil$个键值,至多有m个键值
- 所有叶子节点在同一层(完全平衡)
B+树的关键特性
- 特性1:叶子节点链表
- 所有叶子节点通过指针连接成有序链表
- 支持高效的范围查询
- 支持顺序访问
- 支持快速的区间扫描
- 示例:查找范围[25, 65]
- 定位到第一个叶子节点(包含25)
- 沿着链表顺序访问,直到65
- 无需回到内部节点
- 所有叶子节点通过指针连接成有序链表
- 特性2:数据存储的分离
- 内部节点
- 只存储键值和指针
- 不存储实际数据
- 纯粹的索引结构
- 叶子节点
- 存储键值和对应地数据
- 是唯一地数据存储位置
- 所有查询最终都要到达叶子节点
- 内部节点
- 特性3:键值的冗余
- B+树中的键值存在冗余
- 内部节点的键值也会出现在叶子节点中
- 内部节点的键值起到路标作用
- 叶子节点的键值关联实际数据
- 示例:
- 内部节点有键30:表示“大于等于30的数据在右子树”
- 叶子节点有间30:表示存储键30对应的实际数据
- B+树中的键值存在冗余
B+树的基本操作
查找
单点查找
|
|
范围查找
|
|
插入操作
插入过程
|
|
叶子节点分裂
|
|
内部节点分裂
|
|
删除操作
删除过程
|
|
处理下溢出
|
|