什么是最左前缀法则?什么时候索引将失效?
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始, 并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。
索引失效情况:
-
联合索引失效:即不符合最左前缀法则。注:与我们编写SQL时,条件编写的先后顺序无关
-
范围查询:联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。(当范围查询使用>= 或 <= 时,就能走联合索引,所以,在业务允许的情况下,尽可能的使用类似于 >= 或 <= 这类的范围查询,而避免使用 > 或 <)
-
索引列运算:不要在索引列上进行运算操作,否则索引将失效。
# 比如:当根据phone字段进行函数运算操作之后,索引失效 explain select * from tb_user where substring(phone,10,2) = '15';
-
字符串不加引号:字符串类型字段使用时,不加引号,索引将失效。(如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。)
-
like模糊查询:如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
-
or连接条件:用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。(当or连接的条件,左右两侧字段都有索引时,索引才会生效。)
-
数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。 因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不 如走全表扫描来的快,此时索引就会失效。