mysql索引底层原理分享

对于在使用mysql的你,一定知道mysql索引可以加快数据查询速度,提高查询效率,但你对其索引原理是否了解呢?接下来和大家分享一下mysql索引原理,请耐心看完哦
局部性原理: CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。用通俗的话来说就是进行磁盘IO的时候不是只取某条数据,而是将数据所在页数据全部取出,加载到缓存中。了解了数据是一页一页进行读取之后,进入数据存储介绍。

假设数据有五个字段,a(主键),b,c ,d,e

数据每一页的存储结构: 如下图所示
在这里插入图片描述
图解析:右边蓝色区域为数据区,每一页数据有一个固定大小(假设为16k),如果每一条数据很小,那这一页就可以存储成百上千甚至更多的数据,而查询的时候一条数据一条数据的遍历也会带来很大的开销,在这一页添加一个目录,将每页的数据分成一段一段,为每一段数据提供一个指针,并记录最小id,那么根据要查询的id就可以快速定位到数据存放位置,取出相应的数据,对于每一页中数据的读取问题就解决了,引入下一个问题,如果数据一页存不下,则需要新的一页或者更多页,那么数据存储在哪一页上如何判断呢?
在这里插入图片描述
对于数据量大,页数很多的情况,如果一页一页遍历的话,那也是一个很大的开销,解决同页数据查询相同,是否也可以创建一个目录来记录页,如下图所示:
在这里插入图片描述
有了目录页,只要根据id的值便可以判断数据存储在哪一页上,是不是就查询的很快了,接下来看多页的情况:
在这里插入图片描述
依次类推,是不是就解决了页查询的问题了,但是上图中的结构是不是很眼熟呢??看下面这张图片你就知道了
在这里插入图片描述
没错,就是B+树的结构模型呢!现在再看B+树是不是就很清晰了呢,对其查询原理有所感悟了!
接下来为bcd字段创建联合索引,结构如下图:
在这里插入图片描述
接下来有这样一条sql语句:

select * from my_table where b=2 and c=4;

查询这个联合索引表就可以查找到bcd数据,但是e数据并没有,那怎么办班呢?解决办法一:将其他数据载入到该索引表,如果进行这样的操作的话,那相同的数据就存储了两份,这是不合理的,舍弃该方法。解决办法二:将该数据对应的主键id存在该字段对应数据位,select *时只需要根据这个id去主键索引表中查找然后返回数据即可
清楚了数据的查询过程,那么对于最左前缀原则也就有了很直观的感受,对于

select * from my_table where c>4;

这样的语句由于无法判断b数据,这个表结构无法进行顺序查找,因而使用不到联合索引,了解了这些,mysql建表和查询时,应该注意些什么是不是就有所了解了呢,嘻嘻
希望小编的分享也能够帮助成长旅途上的你,若是小编讲解的让你很模糊,建议有时间的可以观看观看视频呢,下面是视频分享地址:
https://www.bilibili.com/video/BV11J411i7NQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值