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

相关推荐
Amnesia0_015 小时前
MYSQL表的约束
数据库·mysql
C137的本贾尼15 小时前
锁的分类:表锁、行锁、页锁与意向锁
数据库
Full Stack Developme15 小时前
SQL 执行顺序 及 全部关键字
数据库·sql
千寻girling15 小时前
一周没跑步了 ,今日跑步 5KM , 哑铃+健身 20min , 俯卧撑 30 个 ;
数据结构·c++·python·算法·leetcode·职场和发展·线性回归
专注API从业者15 小时前
电商选品效率翻倍!基于 Open Claw + 淘宝商品 API 实现自动化监控选品(附完整可运行代码)
大数据·运维·数据结构·数据库·自动化
C137的本贾尼15 小时前
InnoDB 内存架构:Buffer Pool、Change Buffer 与 Log Buffer
数据库·oracle·架构
DigitalOcean15 小时前
深度评测:RAG 向量数据库选型指南 —— OpenSearch、Weaviate、pgvector 怎么选?
数据库·ai编程
云计算磊哥@15 小时前
运维开发宝典025-MySQL01数据库的安装和配置
运维·数据库·运维开发
Bert.Cai15 小时前
SQLPlus简介
数据库·oracle
超梦dasgg16 小时前
Redis ZSet(有序集合)底层数据结构
数据结构·数据库·redis