在MySQL中,建立了索引之后,有时候也会出现查询类型是all的情况,造成这种问题的原因是索引没有使用上,造成了索引失效。
索引失效的原因:
- 全值匹配:在查询语句中使用到了索引中所有的字段
- 最佳左侧前缀法则:在索引的使用中从左到右不能跳着使用,不能跳过索引中的列
- 不在索引列上做任何操作(计算、函数、自动\手动类型转换)
- 存储引擎不能使用索引中范围条件右边的列,既是范围之后的列全部会失效
- 尽量使用覆盖索引(只访问索引的查询),减少select*
- mysql在使用不等于的时候(!=或<>)无法使用索引,会导致全表扫描
- is null、is not null也无法使用索引
- like以通配符开头(’%abc…’)MySQL索引会失效,会变成全表扫描的操作,如果非要使用like的时候,%要写在查询字段的右边或者使用覆盖索引
- 字符串不加单引号也会导致索引失效,不加单引号虽然会查询出结果,但是会导致索引失效,因为在MySQL中会有自动类型转换,但是根据第3点而言,自动转换会导致索引失效
- 少用or,用or连接的时候也会索引失效