索引为什么用B+树而不是B树

先给结论,B+树更适合范围查询,B+树有更低的磁盘IO,B+树有更稳定的查询性能

B+树和B树的区别

图例:

B+树

B树

1 B+树更适合范围查询

在B+树中规定,每个节点中的一个数据是其子节点数据的最后一个,那么作为节点的数据就代表的是一个个范围,例如图中<100的范围,100-200的范围,200-300的范围分开为三个区间作为子节点的范围

在需要对全表进行扫描的时候,B树需要我们对整棵树进行一次中序遍历,访问所有节点,而B+树只需要对叶子节点的链表进行一次线性遍历即可

这个过程完全不需要重新从树根开始搜索也几乎不需要回溯,效率非常高

2 B+树有更低的磁盘IO

那么什么时候我们需要磁盘IO?

答案是切换磁盘页的时候,在遍历B+树的时候我们从父节点到子节点就需要进行一次磁盘IO

我们应该知道B+树的非叶子节点里存储的只有键的信息,而B树的非叶子节点里存储的不仅有键还有数据,这就导致了一个问题,键存的更少,那么B树的层数往往很高,而层数高了就导致了我们查询需要的磁盘IO的次数就非常大,磁盘IO的次数直接决定了查询效率,这是一个很大的开销

3 B+树有更稳定的查询性能

同样的由于B树的非叶子节点不仅要存数据还要存键,B树的高度是不确定的,有时候可能一次IO就查询到就结束了,有时候可能需要访问多次直到叶子节点

而对于B+树而言每一次的磁盘IO是确定的,都需要访问到叶子节点,等于树的高度,这是很稳定的,并且,对于数据库操作来说稳定性是非常重要的,因为我们需要对操作有可预测性

总结:虽然不是所有的情况下B+树都比B树要好,但是B+树就是天生为数据库索引而生的,而设计的,它完美契合了"磁盘存储的数据库索引"这一核心设计需求

相关推荐
赵渝强老师33 分钟前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石5 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端