2012-11-20 70 views
1

可能重複:
Join vs. subquery'join'或'where not in()'?

我需要一個龐大的數據集的工作,但需要偶爾排除基於條件的記錄。

由於被檢查的數據量以及將要返回的數據量一次是成千上萬,並且會頻繁運行,所以我想知道是否有人可以說明一些情況哪種方法最好是在速度方面和負載,以便讓一切運行那樣順利,因爲我們可以

SELECT a.* 
FROM table_a as a 
LEFT JOIN table_b 
    ON table_b.a_id = a.id 
WHERE table_b.status <> 'new' 

OR

SELECT * 
FROM table_a 
WHERE id NOT IN (
    SELECT a_id 
    FROM table_b 
    WHERE status <> 'new' 
) 
+0

你確定兩個查詢總會產生相似的結果嗎? –

+0

這些查詢都是例子,所以可能不準確 – duellsy

+0

唉好吧。 –

回答

1

在大多數情況下,JOIN比子查詢快,子查詢速度更快。

連接中的RDBMS可以創建一個執行計劃,是你 查詢更好,可以預測哪些數據應該被加載到被處理和 節省時間,不像子查詢在那裏將運行所有的查詢和 負荷他們所有的數據來處理。

子查詢中的好處是它們比 更具可讀性JOINs:這就是爲什麼大多數新SQL人員更喜歡它們;這是簡單的方法; 但是當涉及到性能時,JOINS在大多數情況下都更好,即使它們不太難讀取也是 。

here

+0

感謝您的來源 – duellsy

0

查詢:

SELECT a.* 
FROM table_a as a 
LEFT JOIN table_b 
    ON table_b.a_id = a.id 
WHERE b.status <> 'new' 

會比另一個更好,因爲它使用連接而不是子查詢。

您還需要檢查列table_b.a_id and table_a.id也索引。

+0

謝謝,yep目前索引 – duellsy

1
SELECT * 
FROM table_a 
WHERE NOT EXISTS (
    SELECT * 
    FROM table_b b 
    WHERE b.a_id = a.id AND b.status <> 'new' 
) 

這個查詢或連接的將是更好的查詢,而不是在查詢中使用插件。 將IN關鍵字用於不適用於子查詢的靜態數據。 在查詢中,NOT EXISTS比IN要好得多。