有哪些情况会导致索引失效?
这个问题要分版本回答!!!版本不同可能会导致索引失效的场景也不同,直接给答案的都是耍流氓!!!
这里回答基于最新MySQL8版本,MySQL8失效的以前版本也失效,MySQL8不失效的,以前可能会失效。
- 使用
like
并且是左边带%
, 右边可以带会走索引(但是并不绝对,详细解释看下面like专题分析)
- 隐式类型转换,索引字段与条件或关联字段的类型不一致。(比如你的字段是int,你用字符串方式去查询会导致索引失效)。
- 在
where
条件里面对索引列使用运算或者使用函数。
- 使用
OR
且存在非索引列
- 在
where
条件中两列做比较会导致索引失效
- 使用IN可能不会走索引(MySQL环境变量
eq_range_index_dive_limit
的值对IN语法有很大影响,该参数表示使用索引情况下IN中参数的最大数量。MySQL 5.7.3
以及之前的版本中,eq_range_index_dive_limit
的默认值为10,之后的版本默认值为200。我们拿MySQL8.0.19
举例,eq_range_index_dive_limit
=200表示当IN (...)中的值>200
个时,该查询一定不会走索引。<=200
则可能用到索引。)
- 使用非主键范围条件查询时,部分情况索引失效 。
- 使用
order by
可能会导致索引失效
is null
is not null
≠
可能会导致索引失效