B-tree(B树)和B+tree(B+树)是两种高效的多叉树数据结构,专为磁盘存储系统优化设计,广泛应用于数据库和文件系统的索引。以下是两者的核心特点及区别:
⚙️ 一、B-tree(B树)
-
结构特性
- 多路平衡:每个节点可包含多个子节点(通常称为阶数 m),非叶子节点存储 键值(Key) 和 关联数据(Data)。
- 平衡规则:
- 根节点至少有 2 个子节点(除非为叶子节点);
- 非根节点至少有 ⌈m/2⌉ 个子节点;
- 所有叶子节点位于同一层。
-
数据存储
- 键值+数据共存:非叶子节点既存储索引键,也存储实际数据记录。
- 搜索灵活性:搜索可能在非叶子节点终止(若命中键值)。
-
适用场景
- 实时查询系统:如 MongoDB 的默认索引,适合单点查询。
🚀 二、B+tree(B+树)
-
结构优化
- 数据分离:非叶子节点 仅存储键值(不存实际数据),所有数据记录存放在 叶子节点。
- 叶子节点链表:叶子节点通过指针串联为有序链表,支持高效范围查询。
-
性能优势
- 更高扇出:非叶子节点仅存键值,可容纳更多子节点,降低树高,减少 I/O 次数。
- 顺序访问优化:范围查询(如
WHERE id BETWEEN 10 AND 100
)直接遍历叶子链表,无需回溯树。
-
适用场景
- 数据库索引:如 MySQL InnoDB 引擎,尤其适合范围扫描和排序操作。
🔍 三、核心区别总结
特性 | B-tree | B+tree |
---|---|---|
非叶子节点数据 | 存储键值+数据 | 仅存储键值(无数据) |
叶子节点结构 | 独立无链接 | 通过指针形成有序链表 |
查询终止位置 | 可能在任何非叶子节点命中 | 必须到达叶子节点 |
范围查询效率 | 低效(需回溯树) | 高效(直接遍历叶子链表) |
💡 四、典型应用
- B-tree:文件系统(NTFS/Ext4)、MongoDB 索引。
- B+tree:关系型数据库(MySQL、Oracle)、大型数据仓库索引。
两种结构均通过 多路平衡 和 动态调整节点(分裂/合并)保持低树高,显著减少磁盘 I/O。B+tree 因数据分离和链表设计,在大数据量下综合性能更优,成为数据库索引的主流选择。