3 回答

TA貢獻1818條經驗 獲得超3個贊
您閱讀的文章使用了一個錯誤的例子,或者您誤解了他們的觀點。
select username from users where company = 'bbc' or company = 'itv';
這等效于:
select username from users where company IN ('bbc', 'itv');
MySQL可以company為此查詢使用索引。無需執(zhí)行任何UNION。
更棘手的情況是您的OR條件涉及兩個不同的列。
select username from users where company = 'bbc' or city = 'London';
假設在上有一個索引,在上company有一個單獨的索引city。鑒于MySQL通常在給定查詢中每個表只使用一個索引,應該使用哪個索引?如果它使用on上的索引company,則仍必須進行表掃描以查找city倫敦所在的行。如果使用on上的索引city,則必須對companybbc 所在的行進行表掃描。
該UNION解決方案是對于這種類型的箱子。
select username from users where company = 'bbc'
union
select username from users where city = 'London';
現(xiàn)在,每個子查詢都可以使用索引進行搜索,并且子查詢的結果由組合UNION。
一位匿名用戶對我的回答提出了修改建議,但主持人拒絕了該修改。它應該是評論,而不是編輯。提議的編輯聲稱,UNION必須對結果集進行排序以消除重復的行。這會使查詢運行速度變慢,因此索引優(yōu)化是一項艱巨的任務。
我的回答是,索引有助于在UNION發(fā)生之前將結果集減少為少量的行。實際上,UNION確實消除了重復項,但是這樣做只需要對小的結果集進行排序。在某些情況下,WHERE子句與表的大部分匹配,并且在UNION期間進行排序與進行表掃描一樣昂貴。但是,通過索引搜索減少結果集的情況更為常見,因此排序的成本要比表掃描的成本低得多。
差異取決于表中的數(shù)據(jù)以及要搜索的術語。確定給定查詢的最佳解決方案的唯一方法是嘗試在MySQL查詢探查器中使用這兩種方法并比較它們的性能。

TA貢獻1900條經驗 獲得超5個贊
這些不是相同的查詢。
我對MySQL沒有太多的經驗,所以我不確定查詢優(yōu)化器會做什么或不做什么,但是這是我一般背景下的想法(主要是ms sql server)。
通常,查詢分析器可以采用上述兩個查詢,并根據(jù)它們制定完全相同的計劃(如果它們相同),所以沒關系。我懷疑這些查詢之間沒有性能差異(等效)
select distinct username from users where company = ‘bbc’ or company = ‘itv’;
和
select username from users where company = ‘bbc’
union
select username from users where company = ‘itv’;
現(xiàn)在的問題是,以下查詢之間是否會有區(qū)別,而我實際上并不知道這些區(qū)別,但是我懷疑優(yōu)化程序會使它更像第一個查詢
select username from users where company = ‘bbc’ or company = ‘itv’;
和
select username from users where company = ‘bbc’
union all
select username from users where company = ‘itv’;

TA貢獻1853條經驗 獲得超9個贊
這取決于優(yōu)化器根據(jù)數(shù)據(jù),索引,軟件版本等的大小來完成的工作。
我猜想使用OR會給優(yōu)化器提供更高的效率,因為所有內容都在一個邏輯語句中。
同樣,UNION也有一些開銷,因為它創(chuàng)建了一個重置集(沒有重復項)。在UNION每個語句應該執(zhí)行很快,如果公司被索引...不知道它會真的做雙倍的工作。
底線
除非您確實有迫切需要從查詢中擠出每一點速度,否則最好采用能最好地傳達您意圖的表格。
更新資料
我也想提到IN。我相信以下查詢將比OR提供更好的性能(這也是我更喜歡的形式):
select username from users where company in ('bbc', 'itv');
添加回答
舉報