Mysql-索引失效情况

72 阅读2分钟

对索引使用左或者左右模糊匹配

使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效

因为索引 B+ 树是按照「索引值」有序排列存储的,只能根据前缀进行比较

对索引使用函数

因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引

从 MySQL 8.0 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值

对索引进行表达式计算

在查询条件中对索引进行表达式计算,也是无法走索引的

对索引隐式类型转换

如果索引字段是字符串类型,但是在条件查询中,输入的参数是整型的话,在执行计划的时候这条语句会走全表扫描

MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较

联合索引非最左匹配

联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配

在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序

联合索引的索引截断问题,在5.6之后出现索引下推的方式来减少回表

WHERE 子句中的 OR

在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效

因为 OR 的含义就是两个只要满足一个即可,因此只有一个条件列是索引列是没有意义的,只要有条件列不是索引列,就会进行全表扫描