- 被查询出来的数据超过一定比例的时候,譬如表里有1000万条记录,一条SQL查的结果有600万,肯定不会走索引了
- 索引列上用了函数的时候,例如where to_char(id) = …
- 索引列上参与了计算,select * from t_user where id +1=2;
- 索引列上发生类型转换的时候,如number列你偏写成where col = ‘1’,加了引号
- like “%_” 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
- WHERE子句中OR条件可能会使索引失效,例如有索引条件or没有索引条件,优化方案:OR左右两边的列均为索引列时,可考虑使用UNION ALL进行优化
- 组合索引没遵循最左原则
- 两列数据做比较,即便两列都创建了索引,索引也会失效
- 查询条件使用不等进行比较时,需要慎重,普通索引会查询结果集占比较大时索引会失效。
- 查询条件使用is null时正常走索引,使用is not null时,不走索引
- 查询条件使用not in时,如果是主键则走索引,如果是普通索引,则索引失效。
- 查询条件使用not exists时,索引失效。
- 查询条件涉及到order by、limit等条件时,是否走索引情况比较复杂,而且与Mysql版本有关,通常普通索引,如果未使用limit,则不会走索引。order by多个索引字段时,可能不会走索引。其他情况,建议在使用时进行expain验证。
