对索引使用左或者左右模糊匹配
使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效
因为索引 B+ 树是按照「索引值」有序排列存储的,只能根据前缀进行比较
对索引使用函数
因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引
从 MySQL 8.0 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值
对索引进行表达式计算
在查询条件中对索引进行表达式计算,也是无法走索引的
对索引隐式类型转换
如果索引字段是字符串类型,但是在条件查询中,输入的参数是整型的话,在执行计划的时候这条语句会走全表扫描
MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较
联合索引非最左匹配
联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配
在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序
联合索引的索引截断问题,在5.6之后出现索引下推的方式来减少回表
WHERE 子句中的 OR
在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效
因为 OR 的含义就是两个只要满足一个即可,因此只有一个条件列是索引列是没有意义的,只要有条件列不是索引列,就会进行全表扫描