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';
) - 某些情況,例如小表,走索引查詢的效率比全表掃描的代價更大,此時優化器會選擇掃描全表。
- 此訪問優化,僅適用於單個表的索引掃描,對於多個表的掃描合並不會生效。