SQL UNION vs OR 性能


SQL UNION vs OR 性能


本文整理自:stackoverflow

地址:https://stackoverflow.com/questions/13750475/sql-performance-union-vs-or

翻譯自Bill Karwin回答:

要麼你讀的那篇文章用了一個不好的例子,要麼你誤解了他們的觀點。

<code>select username from users where company = 'bbc' or company = 'itv';/<code>

等價於:

<code>select username from users where company IN ('bbc', 'itv');/<code>

在這個查詢中MySQL會使用company上的索引。不需要改成UNION。

更棘手的情況是,OR條件涉及兩個不同的列。

<code>select username from users where company = 'bbc' or city = 'London';/<code>

假設company列和city列都有一個獨立的索引。MySQL通常在一個給定的查詢中每個表只使用一個索引,那麼應該使用哪個索引呢?如果它使用company上的索引,它仍然必須執行表掃描,以找到倫敦所在的行。如果它使用city上的索引,則必須對company為bbc的行進行表掃描。

UNION 解決方案適用於這種情況。

<code>select username from users where company = 'bbc'  

union
select username from users where city = 'London';/<code>

這樣的話每個子查詢都可以使用索引進行搜索,然後再將子查詢的結果合併在一起。

union ? union all ? 取決於需求及where過濾後的數據量對於索引列來最好使用union all,因複雜的查詢【包含運算等】將使or、in放棄索引而全表掃描,除非你能確定or、in會使用索引。對於只有非索引字段來說你就老老實實的用or或者in,因為 非索引字段本來要全表掃描而union all 只成倍增加表掃描的次數。


SQL UNION vs OR 性能


SQL UNION vs OR 性能


分享到:


相關文章: