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

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

数据每一页的存储结构: 如下图所示

mysql索引下堆 mysql索引底层实现原理_数据


图解析:右边蓝色区域为数据区,每一页数据有一个固定大小(假设为16k),如果每一条数据很小,那这一页就可以存储成百上千甚至更多的数据,而查询的时候一条数据一条数据的遍历也会带来很大的开销,在这一页添加一个目录,将每页的数据分成一段一段,为每一段数据提供一个指针,并记录最小id,那么根据要查询的id就可以快速定位到数据存放位置,取出相应的数据,对于每一页中数据的读取问题就解决了,引入下一个问题,如果数据一页存不下,则需要新的一页或者更多页,那么数据存储在哪一页上如何判断呢?

mysql索引下堆 mysql索引底层实现原理_mysql索引下堆_02


对于数据量大,页数很多的情况,如果一页一页遍历的话,那也是一个很大的开销,解决同页数据查询相同,是否也可以创建一个目录来记录页,如下图所示:

mysql索引下堆 mysql索引底层实现原理_数据_03


有了目录页,只要根据id的值便可以判断数据存储在哪一页上,是不是就查询的很快了,接下来看多页的情况:

mysql索引下堆 mysql索引底层实现原理_字段_04


依次类推,是不是就解决了页查询的问题了,但是上图中的结构是不是很眼熟呢??看下面这张图片你就知道了

mysql索引下堆 mysql索引底层实现原理_mysql索引下堆_05


没错,就是B+树的结构模型呢!现在再看B+树是不是就很清晰了呢,对其查询原理有所感悟了!

接下来为bcd字段创建联合索引,结构如下图:

mysql索引下堆 mysql索引底层实现原理_mysql索引下堆_06


接下来有这样一条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建表和查询时,应该注意些什么是不是就有所了解了呢,嘻嘻