2011-11-14 81 views
1

我有兩個非常大的表,Table1和Table2。他們看起來像這樣:當三列相等時,MySQL將兩個非常大的表組合在一起

表1(800k記錄):姓名,出生日期,訂單號,col4,col5,col6。表2(200k條記錄):姓名,出生日期,訂單號,col4,col5,col6。

如何從表1中選擇表2中沒有匹配Name,BirthDate,OrderNumber組合的所有記錄?其餘的列無關緊要。

我試着做下面這個查詢至少運行幾分鐘,沒有明顯的結束。現在我只是試圖選擇記錄,然後我可以弄清楚如何組合表格。

Select Table1.Name, Table1.BirthDate, Table1.OrderNumber from Table1 
left join Table2 ON 
Table1.Name=Table2.Name AND 
Table1.BirthDate=Table2.BirthDate AND 
Table1.OrderNumber=Table2.OrderNumber AND 
WHERE Table2.Name IS NULL; 

回答

2

你可以嘗試這個變化,看看它是否更好。你也應該確保你有Name,BirthDate和OrderNumber索引。

SELECT t1.Name, t1.BirthDate, t1.OrderNumber 
    FROM Table1 t1 
    WHERE NOT EXISTS(SELECT NULL 
         FROM Table2 t2 
         WHERE t2.Name = t1.Name 
          AND t2.BirthDate = t1.BirthDate 
          AND t2.OrderNumber = t1.OrderNumber) 
+0

我試過這個,到目前爲止它已經運行了幾分鐘而沒有任何結果。 – Ray

+0

@射線我提到的索引存在? –

+0

當然可以。對不起,我忘了提及,我認爲這是顯而易見的一個表這個大=) – Ray

2

如果你能在查詢階段打敗你作爲你的問題的一部分包含的查詢,我會感到驚訝。

不是要說明一點,但我懷疑你的索引需要更新。爲了使這個查詢快速運行,我相信你需要在這兩個表中的每一個上有一個索引,其索引位於(Name, BirthDate, OrderNumber)。這與那些專欄上的三個獨立索引完全不同。

您也可以通過設置適當的主鍵即PRIMARY KEY (Name, BirthDate, OrderNumber)來實現此目的。

如果我的猜測不正確,那麼在每個表上看到SHOW CREATE TABLE的結果會很有幫助。

+0

感謝這是一個多列索引的好主意。我不能做一個主鍵,因爲其中一個字段有時可以爲空。我現在嘗試使用多列索引。 – Ray

+0

感謝您的迴應,它幫助我產生了最終的想法。我的主要目標是將小表中的所有內容合併到較大的表中。因此,我只是在這3列中創建了一個唯一的組合鍵,並執行了「插入忽略」,因此它會自動排除導致衝突的列。 – Ray

+0

很高興你得到它的工作, – Pursuit

相關問題