对于 MySql 索引存储结构 B+树的理解笔记

本文深入浅出地介绍了B+树的原理及其在数据库索引中的应用。从数据存储方式出发,对比了二叉查找树、平衡二叉树、B树等数据结构,详细解释了B+树的特点和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始了解B+树的时候我也是看的里雾里的,在网上找了好多文章才勉强知道一个所以然,趁有时间把自己所理解的记录下来。
ps:文中图片来源于网络,仅为方便阅读理解,望原文作者勿怪…

首先了解一下:数据的存储都是在磁盘上的,只有在使用的时候才读取到内存(ps:mysql 有缓存器,再次读取是从缓存器读取的),每次最多读取磁盘上一页的数据,每次读取为一次IO

如果我们要在一个磁盘上找到我们想要的数据,是要把磁盘全部内容遍历一遍? 要是程序这么设计的话,我们怕是要分分钟砸电脑

举个简单的栗子:我们在图书馆看书的时候是一本本去找自己想要的书吗?当然不是,聪明人都是先找到自己想要看的书所在区域,再找到书架,再从书架上找自己想要看的书,磁盘找数据也是如此,只不过查找的方式不同罢了
虽然磁盘上存的东西是杂乱无章的,但是我们可以建立数据目录,通过目录查找到数据,也就是索引,准确来说是聚簇索引

把全部数据想象成一棵树,那么每一个数据页就是一个树的节点,我们想要的数据就在树的节点上,也就是说查询一个数据需要遍历的节点数越多,IO的次数就越多,耗时就越大,也就是越慢,怎么快速找到这个节点,就是我们研究的方向
所以:想要数据库查询速度越快,就是需要IO的次数越少,遍历的树的节点数越少

一、二叉查找树

当有一堆数据要存入时,我们取存入数据主键作为key,存入数据为data作键值对,根据存入的顺序,以第一个key为根节点,比当前key小的数据放在右节点,比当前数据key大的数据放在右节点建一棵树,如下图:在这里插入图片描述
当要查询一个key时,从根节点开始比较,一步步锁定key的范围,有点类似二分法

当然这是最理想的情况,当数据存入不理想时,就会出现一边倒的情况,当查找一个数据时比如17,就相当于要把全部数据遍历一遍,这样效率就很低下了,如下图:
在这里插入图片描述

总结:二叉查找树是节点是有序的(左小右大)树型数据结构

二、平衡二叉查找树(简称:平衡二叉树)

平衡二叉树在二叉查询数据的基础上进行了改进:每个节点左右子树的高度差不得大于1,如果新增或者删除后导致二叉树的左右子数的高度差大于1,那么就要对数进行旋转。旋转后的二叉树保持树的每个节点的左右子数高度差小于等于1
如下图所示:
在这里插入图片描述
这样就解决了特殊情况下导致的查询效率慢的问题

总结:平衡二叉树是节点是有序的能时刻保持稳定性的树型数据结构

三、B 树(Balance Tree 也叫 平衡树 )

B 树在平衡二叉树的基础上再次进行改进,在每个节点上可保存N个数据键值对和N+1个指针

非叶子节点第1个指针指向小于第1个数据key的子树,第N+1个指针指向大于第N+1个数据key的子树,第K个指针指向大于K-1数据key 且 小于 K数据key的子树(1<K<N+1),叶子节点指针指向NULL
在这里插入图片描述

数据插入时先找到数据key所对应叶子节点,从叶子节点开始插入,若新增数据后叶子节点所携带的数据数大于m-1,则以节点中心分裂成两个节点,存在中间数据则将中间数据插入到父节点并继续判断父节点是否需要分裂。

总结:B 树是节点和节点内数据是有序的能时刻保持稳定性每个节点可携带多个数据的树型数据结构

四、B+ 树

B+树是在B树之上再次进行优化
当我们查询我们想要的数据时,往往需要从磁盘中进行多次的读取,而在读取的过程中所返回的数据都是无效的,为了将性能使用到极致,B+树把非叶子节点中的数据模块去掉了,非叶子节点中只保存数据key 和 指针,只有在叶子节点才有数据,并且在叶子节点中去掉了指针域
在这里插入图片描述

在MySql 中索引默认就是用B+树的结构保存的,并且将B+树和链表相结合,在节点与节点之间使用双向链表连接,在叶子节点的内部数据与数据直接用单向链表连接,这样更方便于范围查询
在这里插入图片描述

B+树是节点和节点内数据是有序的能时刻保持稳定性每个节点可携带多个数据更方便于查询的树型数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值