Mysql索引底层原理以及为什么范围之后全失效

一、介绍底层索引
大家好,今天这篇我说一个我个人对索引的底层原理及为什么范围之后全失效的问题,如有错误,请指正,谢谢。
首先,大家要清楚mysql索引底层使用的树形数据结构是B+Tree,并不是B-Tree;为什么不是二叉树,红黑树,B-Tree呢,大家可以自行百度,这儿就不一一说明了。
先放一张B+Tree的图:
在这里插入图片描述
这是单值索引时底层的样子。用单值索引(id)来查询数据时,是这样实现的:
1.如果你需要查询id为30的键,会把第一排的所有数据放进缓存中,找出有这个值的地方(应该是二分查找),发现在15-56的区域。
2.它会顺着向下找,再次把这块数据(只是指向的这一区域,并不是所有第二排)放进缓存中,查找出有30的地方,发现在20-49的区域。
3.继续向下找,最终找到第三层,也就是叶子节点值为30的区域,data为主键索引对应的数据;此索引为id,那么data为id对应的一整行数据。这样,经过3次查找,最终找出数据。

接下来说说复合索引时底层是怎么样的:
在这里插入图片描述
绘图能力不行,就去网上找的图片,抱歉;复合索引也是3排,这张图应该时从第二排开始的,最底层紫色的就是数据。先介绍一下复合索引:
它是按照什么顺序存放的呢?
会先按照第一层索引排序,如果第一层数据一样,则会按照第二层排序,如果第二层还是一样,则会继续按照第三层排序。
在这我就说说它B+Tree的特性了,也就是与B-Tree不同的地方(大家可以去百度看一下B-Tree的图片):
1.B-Tree不论是第一排还是第二第三排(叶子节点)每个索引下都会有数据,如果上图时B-Tree,10002下就会有像叶子节点底层一样紫色的数据块。
2.B+Tree每两个节点之间都有指针,从左往右,如果是找出第一个值大于10001的,直接就可以顺着指针找出10001右边所有的数据;而B-Tree却是没有指针的。
注意:不论是复合索引还是非主键单值索引,数据都存放的是主键的值,他会根据这个值去找主键索引对应的数据。
二、范围之后全失效的问题
因制图能力的不行,小白一个,也找不出什么好用的免费的生成数据结构的软件,所以不能向第三方支付(上一篇博客)那样的详细介绍每个数据结构及优缺点了,见谅。
接下来说说今天我想讲的一个索引范围之后全失效的问题,其实讲到这大概读者们已经知道为什么了,当时我学习时看的Mysql高级视频只是讲了它会失效,但是没有将为什么,网上找了一些资料,我才搞清楚。
还是采纳上一张复合索引图片,假设复合索引第一个的为id,第二个为name,第三个为date,表名为table;
下面来一条sql语句:
select id,name,date from table where id=10001 and name>‘Assistant’ and date=‘2001-09-03’;
相信大家都知道id和name索引会生效,date会失效,但是这是为什么呢?
先看看name为什么生效,name>‘Assistant’ 也就是说在id=10001的情况下,只需要用指针按顺序找到name为’Assistant’ 右边的所有数就行,所以它生效了;至于第三个date=‘2001-09-03’,大家想想,只有在第一层,第二层固定都相等的情况下,第三层才会排序,才能按照顺序把第三个值找出来,也就是说,第二层条件如果是个范围,那么第三层就是无序的,那么系统该怎么去找出第三层指定的值呢,这不就失效了吗?

以上是我的个人理解,如有哪儿不足,请指出,谢谢观看!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值