MySQL-B\B+树索引


前言

这一章节会介绍MySQL索引的底层原理,以及B\B+树索引的差异。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块,对应索引树的节点,索引树越低,磁盘IO次数就越少,从而提升系统的性能。
在MySQL请求数据访问时,通过磁盘IO操作将数据按块读取到内存页面中,数据块的大小一般是内存页面存储的整数倍(4*n)k。
在这里插入图片描述

通过执行一条简单的select语句,了解一下索引执行流程:

select * from stu where uid=1;

在这里插入图片描述


一、B树索引

B-树是一种m阶平衡树,叶子节点都在同一层,由于每一个节点存储的数据量比较大,索引整个B-树的层数是非常低的,基本上不超过三层。由于磁盘的读取也是按block块操作的(内存是按page页面操作的),因此B-树的节点大小一般设置为和磁盘块大小一致,这样一个B-树节点,就可以通过一次磁盘I/O把一个磁盘块的数据全部存储下来,所以当使用B-树存储索引的时候,磁盘I/O的操作次数是最少的(MySQL的读写效率,主要集中在磁盘I/O上)。虽然AVL树和B树在查询时采用的都是二分搜索,空间复杂度都为
O ( l o g 2 ( n ) ) O(log_2(n)) O(log2(n))但是B树对磁盘IO的操作次数更少,所以MySQL索引结构通常基于B树。

1、在B-索引树结构中一个节点通常包含子节点的地址信息-P,数据表中记录的主键-key,以及表中记录的除主键以外的数据段-data;
2、在InnoDB存储引擎中,因为数据和索引树都存储在.ibd文件中,所以此时data中存储了表中的数据本身的内容;但是在MyISAM存储引擎中,由于索引树和数据分别存放在.MYI和.MYD中,所以在MyISAM存储引擎下,B树的data中存储的是数据在磁盘中的地址;
3、一颗m阶的B树,一个节点可以存放m个指针域,(m-1)个数据域。

在这里插入图片描述

B\B+树的差异,为什么InnoDB和MyISAM的索引底层选择B+树而不是B树?
1、从图中可以看出,B树的每个节点中存放数据有key,也有data,由于每一个节点的存储空间是有限的,当data数据较大时,会导致每个节点能存储的key的数据很小;
2、索引和数据内容分散在不同的节点上,离根节点近搜索快,离得远搜索慢;导致搜索时间很不平均;
3、B树不方便做范围搜索,整表遍历也不方便;
4、当存储的数据量很大时同样会导致B树变得很高,磁盘的IO次数增加,效率降低。
B树仍然存在上述几个问题,所以进一步优化成为了B+树。

二、B+树索引

1、每一个非叶子结点只存放key,不存放data;每个节点存放的key变多,层数更低,搜索效率也会更高;
2、叶子结点存放了所有的数据data(索引值),每搜索一个索引对应的值都会跑到叶子结点上,这样的搜索时间很平均;
3、叶子结点被串在一个链表中,形成了一个按key值大小排序的有序的链表;在进行范围搜索和整表遍历的时候只需要对叶子结点的有序链表进行遍历。

在这里插入图片描述

索引的底层原理:以 select * from stu where uid=1; 举例
当通过select语句对表进行搜索时,如果添加了过滤条件,SQL会对过滤字段where uid=1进行查询是否存在索引,如果没有索引将会进行整表搜索;如果uid存在索引,请求操作系统kernel对磁盘进行IO操作,将磁盘的索引文件加载到内存空间,利用B+树来构建一颗索引树。


总结

该部分从理论层面讲解了B\B+树的差异,对InnoDB和MyISAM存储引擎的索引底层原理进行了简单的描述,后续将继续介绍MySQL索引部分的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值