2015-10-23 64 views
1

我有一個查詢,通過加入3個大表(每個〜1mm記錄)獲取數據,此外他們是非常繁忙的表。mysql在子句和大表連接

做傳統的加入比較好嗎?或者首先從第一個表中獲取值,然後執行第二個查詢來傳遞檢索到的值,如逗號分隔的子句中那樣?

選項#1

SELECT * 
FROM BigTable1 a 
INNER JOIN BigTable2 b using(someField2) 
INNER JOIN BigTable3 c using(someField3) 
WHERE a.someField1 = 'value' 

VS

選項#2

$values = SELECT someField2 FROM WHERE someField1 = 'value'; #(~20-200 values) 

SELECT * 
FROM BigTable2 
INNER JOIN BigTable3 c using(someField1) 
WHERE someField2 in ($values) 

選項#3

創建臨時表將這些值從BigTable1 存儲和使用這而不是直接加入BigTable1

還有其他的選擇嗎?

+0

什麼單位是毫米?百萬?數百萬?謝謝... –

+0

取決於行和基數的大小。 –

+0

您也可以針對子查詢結果進行連接,但mysql的查詢優化器可能會或可能不會那樣做。在查詢中使用'EXPLAIN',看看哪一個看起來更好。例如:'SELECT * FROM table1 INNER JOIN(SELECT somefield2 FROM table2 WHERE somefield1 ='value')as b on table1.f1 = b.f2' –

回答

0

我認爲最好的選擇是嘗試兩種方法並對它們運行解釋。 最後,你可以做的一個優化是爲第二種方法使用存儲過程,這將減少必須從客戶端運行2個查詢的時間/開銷。

最後,連接對於非常大的表格來說是相當昂貴的操作,因爲您基本上預測並選擇了超過1米x 1米的行。 (條款:What are projection and selection?

+0

@Chaim Klar如果你在你的表中設置了適當的鍵和索引,mysql可能會做一個比預期運行JOIN查詢要好得多。看看@ http://stackoverflow.com/questions/173726/when-and-why-are-database-joins-expensive –

+1

+ maythesource.com,我會閱讀在資源方面,謝謝! –

0

您的問題沒有明確的答案,您可以通過兩種方式進行配置,因爲它們取決於多種因素。

但是,通常會採用第一種方法,如果所有表格都正確編制索引並且行的大小爲「標準」,則應該更快。 同時考慮到在第二種方法中,網絡通信的延遲將會更糟,因爲您需要多次訪問數據庫。

+0

只有在不使用存儲過程的情況下,延遲纔是一個課題,另外,他確實提到了特定的表格非常繁忙,這意味着可能有一點可以降低開銷。同意他需要分析兩種方法! –