MySQL DBMS执行查询前是否会改写!=条件语句以利用索引?
结论
MySQL的查询优化器确实会在逻辑优化阶段对!=/<>这类不等值查询条件做等价改写,转换为<和>组合的范围查询条件,只要符合索引生效的前提,就能触发索引范围扫描。你示例中的两条查询在优化器处理后的逻辑执行树完全一致,所以explain结果均为range范围扫描,执行效率没有差异。
补充说明
- 首先纠正广为流传的认知误区:
!=一定不能走索引是错误结论,只要满足索引生效条件,优化器会自动处理不等值条件匹配索引。 - 只有符合以下情况时,
!=查询才不会走索引:- 不等值判断的字段没有创建对应索引
- 字段上存在函数调用、隐式类型转换,导致索引失效
- 优化器评估不等值条件的过滤性极低(通常符合条件的行占比超过表总数据量的20%~30%,不同版本阈值有差异),认为全表扫描成本低于索引扫描,主动放弃使用索引
- 实际开发中不需要手动把
!=改写成<+>的组合,优化器会自动做等价转换,两种写法的执行效率没有区别。
内容的提问来源于stack exchange,提问作者Soo
相关产品推荐
相关产品推荐

