联合索引生效和失效条件
- 联合索引生效的条件
- 索引失效的条件
- 使用索引的一般性建议
联合索引生效的条件
联合索引又称为复合索引。
两个或更多列上的索引,被称之为复合索引。
MySQL从左到右的使用索引当中的字段,一个查询可以使用索引的一部分,但只能是最左侧部分,例如索引是KEY INDEX(A, B, C), 可以支持A或者A,B或者A,B,C三种组合进行查询。但不支持B、C进行查询。
当最左侧字段是常量引用时,索引就十分有效。利用索引中的附加列可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。
复合索引的结构和电话簿类似,人名由姓和名构成。电话簿首先按照姓氏进行排序,然后按照名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用。如果您知道姓和名,电话簿则更为有用。但如果您只知道名不知道姓,电话簿将没有用处。
所以说创建复合索引时,应仔细考虑列的顺序。对索引当中所有列执行搜索或仅对前几列进行搜索,复合索引非常有用。仅对后面的任意列执行搜索时复合索引则没有用处。
索引失效的条件
- 不在索引列上做任何操作。包括但不限于计算、函数、自动或者手动类型转换会导致索引失效,而转向全表扫描。
- 存储引擎。不能使用索引范围条件右侧的列。
- 尽量使用索引覆盖。即只查询索引的查询,索引和查询列一致,减少select * 。
- MySQL在使用不等于的时候(!=, <>)无法使用索引,会导致全表扫描。
- is null, is not null 也无法使用索引。
- Like以通配符开头,即‘%ABC’。MySQL索引失效,会变成全表扫描。
使用索引的一般性建议
- 对于单键索引,尽量选择针对当前query过滤性更好的索引。
- 在选择组合索引的时候,当前索引当中过滤性最好的字段,在索引字段顺序中位置越靠前越好。
- 在选择组合索引的时候,尽量选择可以包含当前query的where子句当中更多字段的索引。
- 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。
参考资料:数据库面试题:分别谈谈联合索引生效条件和失效条件?