2022-01-11 16:35:33
MySQL索引失效的场景:
在MySQL中,索引是提高查询效率的重要手段,但在某些情况下,索引可能会失效,导致查询性能下降。以下是MySQL索引失效的常见场景:
联合索引不满足最左匹配原则:
当使用联合索引时,查询条件必须按照索引字段的顺序从最左边开始匹配,否则索引将失效。
例如,对于联合索引(sn, name, age),查询条件可以是sn、sn和name的组合、或者全部三个字段,但如果是仅name、name和age的组合、或者仅age,则索引不会生效。
模糊查询最前面的为不确定匹配字符:
在使用LIKE进行模糊查询时,如果通配符%出现在字符串的最前面,则索引将失效。
例如,LIKE '%张三' 无法使用索引,而LIKE '张三%' 则可以使用索引。

索引列参与了运算:
如果在查询条件中对索引列进行了运算(如加减乘除、函数操作等),则索引将失效。
例如,对于索引列age,查询条件age+1=18会导致索引失效。

索引列使用了函数:
如果在查询条件中对索引列使用了MySQL提供的函数(如IFNULL、DATE_FORMAT等),则索引将失效。
例如,对于索引列address,查询条件IFNULL(address, '未知')='高老庄'会导致索引失效。

索引列存在类型转换:
如果查询条件中的数据类型与索引列的数据类型不一致,且MySQL需要进行类型转换才能进行比较,则索引将失效。
例如,对于字符串类型的索引列address,查询条件address=123(其中123为整数)会导致索引失效。

索引列使用is not null查询:
当在查询条件中使用is not null对索引列进行筛选时,索引可能会失效(具体取决于MySQL版本和优化器)。
相比之下,使用is null通常能够正常触发索引。

总结:
为了避免MySQL索引失效,建议在设计和使用索引时注意以下几点:
通过合理使用索引并避免上述索引失效的场景,可以显著提高MySQL查询的性能。