OR查询是否会使得索引失效?

OR查询是否会使得索引失效?

并不会。因为mysql的查询优化器有一项技术叫[Index Merge Optimization],也就是index_merge优化.
index_merge包含了3种算法来优化语句的逻辑:

  • Using intersect
    交集访问算法。当where语句的key条件以and结合,会以此算法访问做优化。
  • Using union
    合并访问算法。当where语句的key以or结合,key的条件可以是const,pk的条件可以是范围,会走此算法优化。
  • Using sort_union
    合并排序访问算法。基于union,当where语句的key(非pk)包含范围条件时,此访问算法适用。
    不同于union,这个算法,是先获取所有的行ID集合,然后排序返回。

注意的是:

  1. index_merge优化无法适用于full-text index。
  2. index_merge需要配置optimizer_switch,也就是变量optimizer_switch里存在index_merge/index_merge_intersection/index_merge_union/index_merge_sort_union几个配置项,且值为on(show VARIABLES like 'optimizer_switch';
  3. 某些情况,例如小表,走索引查询的效率比全表扫描的代价更大,此时优化器会选择扫描全表。
  4. 此访问优化,仅适用于单个表的索引扫描,对于多个表的扫描合并不会生效。

参考资料:

8.2.1.3 Index Merge Optimization

原文地址:https://www.cnblogs.com/xiangcaiduoyidian/p/14178332.html