Mysql 优化 or


or 关键字连接的两边条件都是索引字段,执行计划如下

or 关键字连接的两边条件,一个是索引字段,另外一个是非索引字段,执行计划如下

从第一条 Sql 的执行计划可以看出,where 条件后面使用 or 进行条件连接,查询结果是范围查询,虽然用到了索引 idx_name,但是 type 为 range,并且 Extra 列显示使用了 Using index condition(索引下推),效率不高

从第二条 Sql 的执行计划可以看出,or 的两边一个是索引条件,另外一个是非索引条件,索引失效了,使用的是全表扫描

所以尽量少的使用 or 来连接条件,可以考虑使用 union all 来替代 or 以达到更好的效果

必要的时候甚至可以考虑使用 union 来优化(union all 相比于 union 来说,会有去重和排序的额外操作,如果需要返回的结果不需要排序和去重,union 效率高于 union all)