MySQL索引失效常见场景总结
字段套函数索引失效
有索引的字段进行函数操作,那么这个SQL语句大概率不走这个索引的
因为索引是有序的,经过函数嵌套后的索引字段已经破坏了有序性
当查询条件对索引列使用函数时,数据库无法直接利用索引的有序性
如果还想让这个函数走索引,可以考虑使用函数创建索引,需要看存储引擎是否支持
隐式类型转换
有索引的字段在进行条件判断的时候,SQL语句数据类型如果没有对应上,会出现自动的类型转化
如: order_id字段是字符串类型,筛选order_id是不是等于6,此时,这个6就会发生一个隐式转化变成字符串6
本质上也是函数操作,就是套用了转换函数而已
所以原理和有索引的字段进行函数操作是一样的
隐式字符编码转换
这种情况是比较特殊的,常见的场景是当两个表的字符集使用的不一样,在进行表之间的连接查询的时候,MySQL会自动对连接字段进行字符集转化,此时就会导致索引失效、
本质上也是函数操作,就是套用了转化字符集的函数而已
所以原理和有索引的字段进行函数操作是一样的
范围查询会阻断后续列匹配
范围查询(如 >、LIKE、BETWEEN)会导致后续的索引“有序性”被破坏,后续列无法继续按索引顺序匹配。当然,第一个范围查询还是生效的,后续破坏有序性了,就不会再往下匹配了
举个例子
-- 索引 (A, B, C)
SELECT * FROM table WHERE A = 1 AND B >= 10 AND C = 20;
此时索引A、B字段索引生效,B是范围查询,所以阻断了后续列的匹配,C字段失效