索引为什么用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+树就是天生为数据库索引而生的,而设计的,它完美契合了"磁盘存储的数据库索引"这一核心设计需求

相关推荐
驭渊的小故事18 小时前
简单模板笔记
数据结构·笔记·算法
VT.馒头18 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
devmoon19 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
认真的薛薛19 小时前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员19 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
·云扬·20 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
历程里程碑20 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun20 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon20 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
用户9828630256820 小时前
pg内核实现细节
数据库