第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL Performance UNION與OR

SQL Performance UNION與OR

慕碼人8056858 2019-11-13 13:58:57
我剛剛閱讀了優(yōu)化文章的一部分,并對以下語句進行了細分:當使用SQL代替using語句OR有UNION:select username from users where company = ‘bbc’ or company = ‘itv’;至:select username from users where company = ‘bbc’ unionselect username from users where company = ‘itv’;從快速EXPLAIN:使用OR:使用UNION:沒有這意味著UNION確實在雙工作?盡管我贊賞UNION某些RDBMS和某些表模式的性能可能更高,但這在作者看來并不是絕對正確的。題我錯了嗎?
查看完整描述

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查詢探查器中使用這兩種方法并比較它們的性能。


查看完整回答
反對 回復 2019-11-13
?
梵蒂岡之花

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’;


查看完整回答
反對 回復 2019-11-13
?
暮色呼如

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');


查看完整回答
反對 回復 2019-11-13
  • 3 回答
  • 0 關注
  • 662 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號