2012-02-20 109 views
4

哪個版本的查詢更快/最佳實踐?(好奇的東西)Inner Join與Union全部

更重要的是,它們是否相等?

在這個例子中,這些查詢是否完成相同的事情?

1)INNER JOIN具有兩個或條件:

SELECT 
    DISTINCT (cat.id) as 'Cat ID:' 
FROM 
    cat 
INNER JOIN cuteness_showdown ON 
    (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2); 

2)查詢分開的每一列和UNION ALL:

SELECT 
    DISTINCT (table_1.id) as 'Cat ID:' 
FROM 
    (SELECT 
    cuteness_showdown.cat_1 AS id 
    FROM 
    cuteness_showdown 
    UNION ALL 
    SELECT 
    cuteness_showdown.cat_2 AS id 
    FROM 
    cuteness_showdown) AS table_1; 

現在,哪個版本是更快/最好的做法,如果我需要從另一個表中的列?

1)INNER JOIN具有兩個或條件(無變化):

SELECT 
    DISTINCT (cat.id) as 'Cat ID:', 
    cat.name as 'Cat Name:' 
FROM 
    cat 
INNER JOIN cuteness_showdown ON 
    (cat.id = cuteness_showdown.cat_1 OR cat.id = cuteness_showdown.cat_2); 

2)查詢每個列分別和UNION ALL(需要INNER JOIN貓表):

SELECT 
    DISTINCT (table_1.id) as 'Cat ID:' 
    cat.name as 'Cat Name:' 
FROM 
    (SELECT 
    cuteness_showdown.cat_1 AS id 
    FROM 
    cuteness_showdown 
    UNION ALL 
    SELECT 
    cuteness_showdown.cat_2 AS id 
    FROM 
    cuteness_showdown) AS table_1 
INNER JOIN cat on 
    (table_1.id = cat.id); 
+0

它們是否等同?不,他們做了兩件完全不同的事情。 JOIN根據公共值將兩個錶鏈接在一起,UNION將兩個(可能無關的)結果集組合成一個結果集。 – 2012-02-20 19:19:17

+0

我知道,但我的意思是,他們是否完成了完全相同的事情*在這個例子*? – JohnB 2012-02-20 19:21:50

+2

只是一個側面提示:在你的示例查詢中,括號內的列跟隨着'DISTINCT'似乎表明在這些情況下'DISTINCT',在你看來,正被應用到這些特定的列。不是這樣的:'DISTINCT'總是應用於整個返回的行。括號內的列不超過括號內的列。也就是說,如果您只是將列放在括號內,並且不會誤導您,也不會誤導您的開發人員/數據庫管理員,那很好。只是以爲我會告訴你,如果你有'DISTINCT'功能的誤解。 – 2012-02-20 21:12:41

回答

4

要找出哪一個更快,打破終端,寫一個腳本,每1000次運行一次,並比較結果:)

至於它們是否相同,查詢優化程序w對於執行相同事情的幾個SQL查詢,病態的人經常會提出完全相同的執行計劃,所以他們很可能會這樣做。我不能告訴你這些人是否會得到這種待遇,但是假設你有一些數據,你可以使用EXPLAIN來查看自己的執行計劃並比較它們。

如果執行計劃確實是相同的,最好的做法是選擇更易讀的語句,以便任何維護代碼的人都可以輕鬆地完成這些任務。或者,如果它們不一樣,那麼你必須決定一個難以閱讀的聲明是否值得額外的性能增益,這取決於項目中的交易性能有多大。我認爲,如果你有一個相對較小的數據庫,這個數據庫不可能擴展很多,並且不足10ms的響應時間,那麼性能不是問題,所以只需簡單地維護即可。

+0

我覺得可讀性是主觀的。我努力爭取一致性,並且我個人使用明確的'JOIN'語法,而不是隱式,或者像我給出的#2例子那樣。所以對我來說,我會選擇#1,所有其他的東西都是平等的。我會嘗試你的建議!我想我只是懶惰。 – JohnB 2012-02-21 03:50:40

+0

我沒有嘗試測試以確定哪個更快(當我這樣做時我會報告),但這是我的問題的最佳答案。但是,我最終在查詢中使用了Simon的建議。 – JohnB 2012-02-29 18:05:42

2

還有另一種選擇,

SELECT 
    DISTINCT (cat.id) as 'Cat ID:' 
FROM 
    cat 
INNER JOIN cuteness_showdown ON 
    cat.id IN (cuteness_showdown.cat_1,cuteness_showdown.cat_2) 

非常微小的差別,但有傳言稱IN()似乎總是更有效地打擊比或鍵執行,會看到,如果我可以嘲笑某些表的某些公司數據一種或另一種。

+0

我最喜歡的版本和我看來最具可讀性的,謝謝! – JohnB 2012-02-20 20:39:24

+0

如果需要在「FROM」之前添加',cat.name'作爲'Cat Name:', – 2012-02-20 20:40:47