情侣玩出花
125.96M · 2026-03-26
| 特性 | B树 | B+树 |
|---|---|---|
| 全称 | Balance Tree | Balance+ Tree |
| 提出时间 | 1970年(Rudolf Bayer, Edward M. McCreight) | B树的变种,主要改进用于数据库和文件系统 |
| 本质 | 多路平衡查找树 | 在B树基础上,将数据全部放在叶子节点,内部节点只存索引 |
B树:
B+树:
B树:
B+树:
内部节点: [key1|data1] [key2|data2] [key3|data3]
/ | |
子节点 子节点 子节点 子节点 子节点
内部节点(只存键):
内部节点: [key1] [key2] [key3]
/ |
子节点 子节点 子节点 子节点
叶子节点(存键+数据+链表指针):
叶子节点: [key1|data1] -> [key2|data2] -> [key3|data3] -> ...
|
(指向下一个叶子节点的指针)
B树:
特点:可能在非叶子节点就找到结果,查找路径可能较短。
B+树:
特点:所有查找都必须走到叶子节点,查找路径长度固定(等于树高)。
B树:
B+树:
| 操作 | B树 | B+树 |
|---|---|---|
| 插入 | 可能在任何节点分裂,分裂后键值上移 | 只在叶子节点插入数据,分裂时键值上移到父节点(但父节点不存数据) |
| 删除 | 可能在任何节点合并或借用键值,删除内部节点键值时需要处理子节点 | 只从叶子节点删除数据,内部节点的键值可能保留作为索引(即使对应数据已删) |
| 节点利用率 | 相对较低(键和数据混存) | 更高(内部节点只存键,可以存储更多键,树的高度更低) |
| 分裂频率 | 节点存数据,键数量少,分裂更频繁 | 内部节点只存键,可容纳更多键,相对不易分裂 |
| 维度 | B树 | B+树 |
|---|---|---|
| 单点查找 | 平均更快(可能中途命中) | 稳定 O(logₘN),必须到叶子层 |
| 范围查询 | 较差(需中序遍历) | 极好(利用叶子链表) |
| 磁盘I/O | 可能更少(非叶子节点命中时) | 稳定(树高通常更低) |
| 缓存效率 | 一般 | 更高(内部节点更小,可缓存更多索引) |
| 顺序访问 | 不支持 | 支持(叶子链表) |
| 空间利用率 | 键+数据占用节点空间 | 内部节点纯索引,空间利用率更高 |
补充说明:MySQL的InnoDB引擎默认使用B+树作为索引结构,主要原因就是B+树对范围查询、排序、分页支持更好,且磁盘I/O更稳定可控。
BETWEEN、>、<、ORDER BY、分页查询等,B+树通过叶子链表可高效完成。| 对比项 | B树 | B+树 |
|---|---|---|
| 数据存储位置 | 所有节点 | 仅叶子节点 |
| 内部节点内容 | 键 + 数据指针 | 仅键 |
| 叶子节点是否连接 | 通常不连接 | 有链表连接 |
| 单点查找 | 可能非叶子命中 | 必须到叶子 |
| 范围查询 | 慢(需中序递归) | 快(链表遍历) |
| 树高 | 较高(节点存数据) | 较低(内部节点存更多键) |
| 典型应用 | 较少,特定场景 | 主流数据库、文件系统 |
如果需要,我可以进一步为你讲解 B+树在MySQL InnoDB中的具体实现(聚簇索引 vs 辅助索引),或者深入说明 B树/B+树的插入分裂与删除合并的具体过程。
B+ 树和 B 树都是平衡的多路搜索树,但 B+ 树可以看作是 B 树的一种‘进化版’。它们在磁盘 I/O 优化这个目标上是一致的,但 B+ 树在结构设计上做了几个关键改进,让它在数据库和文件系统里应用更广。
这个差异带来的好处是:B+ 树的内部节点能存更多的索引项,同样大小的磁盘块,B+ 树的分叉数(阶数)更高,树的高度就更低。树越低,查询时磁盘 I/O 次数就越少,这对数据库来说非常关键。
这个设计让 B+ 树做范围查询特别快。比如你查‘id between 10 and 20’,B+ 树只需要找到 10 所在的叶子节点,然后顺着链表往后遍历就行了。而 B 树要做中序遍历,需要不断回溯到父节点再下来,随机I/O更多,性能差不少。这也是为什么 MySQL 的 InnoDB 引擎用 B+ 树而不是 B 树的原因 (业务里范围查询太常见了)
结合上面三点,B+ 树在磁盘 I/O 更少、范围查询更快、查询时间稳定这三个维度上都优于 B 树。而且B+ 树内部节点只存键值,不存数据,数据都在叶子节点,这样缓存命中率更高——内部节点可以常驻内存,大部分查询只需要一次叶子节点的磁盘 I/O。B 树虽然在某些点查询上可能更快(比如数据在上层就命中了),但综合来看,B+ 树更适合大规模数据、磁盘存储、高并发的场景,所以主流数据库都选它。
追加:那 B 树还有用吗?
B 树也不是完全没用了。在一些非磁盘存储、或者点查询特别多且不需要范围查询的场景,B 树还是有优势的,比如某些内存数据库。但整体来说,在磁盘数据库这块,B+ 树是绝对的主流。