失效场景:
- 全表查询的情况会造成索引失效
- 范围查询右边的列,计算式有索引也不能使用索引查询。
- 负责索引,不满足最左前缀法则。
- where条件中,索引字段使用函数
- 如果是字符串类型的索引字段,不加单引号,造成索引失效。
- 索引字段和where条件字段类型不相等,也会造成索引失效。
- 两个不同的索引字段使用or进行连接,就会造成全表扫描。
- 使用like如果前面加%和前后面都加%,不做索引
- 如果某个索引的字段,该字段大部分内容都是一个值,此时,全表扫描就会比索引更快,当查询这一个值的话就会走全表扫描;
- 如果索引字段绝大部分都是null,is null查询条件就会走全表扫描。
- not in 索引失效。
索引用到不足的情况:
如果是查询多个单列索引字段,只会用一个最优的索引字段(辨识度最高),如果是复合索引的情况,满足最左前缀法则,就会是多个索引字段检索。
避免方式:
- 尽量不使用模糊查询,使用全值匹配。
- 最左前缀法则: 使用复合索引,必须按照创建索引的顺序从最左边的列, 连着查询,中间不能有空余字段, 像爬楼梯一样,从1层想直接上3层是不行的,必须要走2层, 但是where条件的顺序没有关系,只是where条件必须包含。
- 范围查询右边的列,不能使用索引查询。
- 保证索引字段和检索条件类型的相等。
- 尽量不使用select * ,尽量使用查询需要的字段。
- 如果光用到了索引字段来显示数据,那就只使用索引字段,这就叫覆盖索引 因为,根据索引查询,第一次是先去索引结构的记录里面查询数据,再通过查询的数据回表查询, 如果是只用到了索引字段,那就只需要在索引里面查出数据就可以了。
- like使用的索引字段时,尽量后面加% 如果like前后必须都加%。
- 使用索引当中的列作为返回结果,也叫覆盖索引。
- 检索条件尽量使用搜索引擎相关的框架来实现。