2015-05-09 130 views
0

以下兩個SQL語句的功能相同:在MySQL中結合SELECT DISTINCT和UNION DISTINCT - 有什麼影響?

SELECT DISTINCT a,b,c FROM table1 
UNION DISTINCT 
SELECT DISTINCT a,b,c FROM table2 

SELECT a,b,c FROM table1 
UNION DISTINCT 
SELECT a,b,c FROM table2 

...因爲「不同」適用於工會作爲一個整體,所以是個人SELECT中的冗餘的。

(注:UNION DISTINCT是相同的,只是UNION本身,但我包括DISTINCT關鍵字爲清楚起見)

我這裏有一個問題,有沒有性能差異,或兩者在MySQL之間執行計劃的區別?或者SELECT DISTINCT是否由優化器變成了常規的SELECT

+0

(我正要指出這些查詢在功能上並不相同,但我錯了!他們是!YLSNED) – Strawberry

+0

我沒有經驗閱讀EXPLAIN的輸出。而且,我想知道一般情況下的答案,而不僅僅是某些特定的表格,這是EXPLAIN會告訴我的。 – Doin

+0

我剛剛在兩個定義爲(int,b int,cint)的臨時表上嘗試了'EXPLAIN',唯一的區別是用'SELECT DISTINCT's,輸出在「Extra」中有「Using temporary」柱。所以我想在這個特殊情況下的答案是,它排序三次(每個'SELECT'一次,'UNION'一次?我想? – Doin

回答

0

您需要檢查執行計劃。但是,我認爲執行計劃是不同的 - 或者至少在某些情況下應該是這樣。

第一個查詢:

SELECT DISTINCT a, b, c FROM table1 
UNION DISTINCT 
SELECT DISTINCT a, b, c FROM table2 

可以隨時利用指標對table1(a, b, c)table2(a, b, c)之前做最後的UNION。這應該通過減少數據的大小來加速最終的聯盟。第二個查詢沒有這個優勢。

其實,寫這個查詢的最有效的方式很可能是有兩個指標及用途:

SELECT DISTINCT a, b, c FROM table1 t1 
UNION ALL 
SELECT DISTINCT a, b, c 
FROM table2 t2 
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t2.a = t1.a and t2.b = t1.b and t2.c = t1.c) 

這幾乎是相同的,儘管它可能在第二個表位處理NULL值不同。

+0

我不確定表上的索引如何幫助,除非你只是所以碰巧有一個索引由a,b和c組成(任意順序)組成,但是在我寫'table1'和'table2'的地方,假設也可以有join或subquery,這將不會被編入索引... – Doin

+0

在兩種情況下,您都可以通過用'<=>'替換'='來處理'NULL'。 – Doin

+0

@Doin ...嘗試回答這個問題你問,無論這是否是你想要問的問題,你的問題對於表而不是子查詢是很清楚的,是的,空安全的相等運算符修復了最後一個查詢,如果你有關於不同查詢的另一個問題,你應該問*另一個問題。編輯這個問題可能會使這個答案失效,這是不禮貌的。 –