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集合,然后排序返回。
注意的是:
- index_merge优化无法适用于full-text index。
- index_merge需要配置optimizer_switch,也就是变量optimizer_switch里存在index_merge/index_merge_intersection/index_merge_union/index_merge_sort_union几个配置项,且值为on(
show VARIABLES like 'optimizer_switch';
) - 某些情况,例如小表,走索引查询的效率比全表扫描的代价更大,此时优化器会选择扫描全表。
- 此访问优化,仅适用于单个表的索引扫描,对于多个表的扫描合并不会生效。