我们来看这样的例子:

##1.索引下推(老版本的优化)

在5.6版本之前如果是这样的有in的写法,因为第一个索引可以找到5条记录,但是第二个索引是在第一个索引字段相同时候才会排序,但是storeid为1,2内的数据之后的filmid并不会排序,所以会首先找到storeid in 1,2的数据然后全部回表然后找到filmid进行判断。

而在之后的版本做了优化,直接在索引里面进行筛选filmid。

##2.松散索引扫描

5.7的版本执行结果 我们来分析一下,这个表有一个联合索引是storeid和filmid,但是filmid是联合索引的第二个,那么没有带头大哥那肯定不行啊,果然虽然分析了sql语句显示的是走索引,但是还是全局扫描了。

8.0的版本执行结果 可以看到上图中的extra中的using index for skip scan 就是松散索引扫描,也可以大白话的解释为跳着扫描。 8.0的执行结果可以看到扫描的行数少了很多,仅有400行,那么是为什么呢?

我们就以上图的表格为例,mysql8有个新特性就是尽管你没有带头大哥,那我就一次遍历带头大哥索引也就是storeid,例如从1开始然后看filmid,因为filmid是排序的,所以可以很快找到有没有符合条件的,然后再找storeid为2的filmid,看起来就像是跳着扫描一样。

##总结