2011-05-05 77 views
2

我有2個MySQL表:t1和t2分別是1M和15M行。表t1只有1個字段:'tel'和t2有很多字段,但也有'tel'字段。我想要做的事很簡單:刪除t1中存在於t2中的所有行:刪除兩個大型MySQL表中的匹配記錄

DELETE FROM t1 WHERE t1.tel IN (SELECT tel FROM t2) 

問題是此查詢似乎沒有完成。我讓它在8核Xeon工作站上運行,2天后我決定停下來尋找替代品。我也嘗試創建一個新表(tt1),並使用LEFT OUTER JOIN僅插入t2中不在t1中的行,但它似乎需要相同的時間。 t1中的'tel'字段是主鍵,它是t2中的唯一鍵(我也嘗試了CREATE INDEX t2tel ON t2(tel),但它沒有幫助)。

有什麼建議嗎?我正在考慮編寫一個C#程序,將這兩個表加載到有序數組或哈希中,並通過代碼完成...先謝謝了。

回答

3
DELETE t1 
    FROM t1 
INNER 
    JOIN t2 
    ON t1.tel = t2.tel; 

這應該比使用子查詢快得多。如果大型表格沒有經過優化,您可以採取很多步驟來優化您的MySQL實例。充足的關鍵緩衝區是一個好的開始。還有很多其他的步驟,您最好在谷歌上進行MySQL性能調優。

+0

此外,http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716。最好的MySQL性能資源,永遠。 – 2011-05-05 05:33:32

0

你有性能的問題,我認爲那是因爲你正在使用的查詢,在查詢內部,你最好使用加入,我做了2個簡單的小表測試,我用這個:

DELETE t1 FROM t1 inner join t2 on t1.id = t2.t1_id; 

它爲我工作,我希望這可以幫助你。