数据库联合索引失效

联合索引的结构
假设这是一个多列索引(col1, col2,col3),对于叶子节点

联合索引(col1, col2,col3)也是一棵B+Tree,其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1、col2、col3的顺序进行排序。

col1表示的是年龄,col2表示的是姓氏,col3表示的是名字
在这里插入图片描述
如图,联合索引(年龄, 姓氏,名字),叶节点上data域存储的是三个关键字的数据。且是按照年龄、姓氏、名字的顺序排列的。

因此我对联合索引结构的理解就是B+Tree是按照第一个关键字进行索引,然后在叶子节点上按照第一个关键字、第二个关键字、第三个关键字…进行排序。

问:为什么遇到范围查询列之后的列索引失效
答:如上图 select * from table where col1=1 and col2 between ‘李’ and ‘黄’ and col3 = ‘安’;col3失效,因为前两个查询条件后锁定前5行,而对于前5行,col3已经不是有序排列,不符合索引的要求了。

在建立联合索引时,都遵循从左往右的优先级,最左优先,当出现范围查询(> < between like等等)时停止匹配。

复合索引失效的几种情况:
1、违背最左缀原则:
a、b、c建立索引
有效索引:
① a
②a,b
③a,b,c
解释:复合索引建立的存储结构,第二个是依赖于在第一个索引使用的基础上,以此类推。
2、like模糊查询,使用最左精确匹配l ike ‘name%’ ,其他方式全表扫描。
3、条件查询中使用 OR、> 、<、!=、between and、where age+1=10、 where name is null 等
在这里插入图片描述

总结:
1.联合索引的使用在写where条件的顺序无关,mysql查询分析会进行优化而使用索引。但是减轻查询分析器的压力,最好和索引的从左到右的顺序一致。
2.使用等值查询,多列同时查询,索引会一直传递并生效。因此等值查询效率最好。
3.索引查找遵循最左侧原则。但是遇到范围查询列之后的列索引失效。
4.排序也能使用索引,合理使用索引排序,避免出现file sort。

在这里插入图片描述