2013-10-28 72 views
0

我正在使用此查詢從一個表中刪除唯一記錄。SUbstiute SubQuery從表中刪除記錄

DELETE FROM TABLE 1 WHERE ID NOT IN (SELECT ID form TABLE 2) 

但問題是,兩個表都有數以百萬計的記錄,並且使用子查詢會很慢。

任何人都可以告訴我任何選擇。

+0

取決於您的索引策略。 – eggyal

回答

1
Delete t1 
from table_1 t1 
left join table_2 t2 on t1.id = t2.id 
where t2.id is null 
+1

MySQL不會優化'NOT IN'反連接的效率與'OUTER JOIN/IS NULL'效率一樣嗎?參見[@Quassnoi的分析](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/):「*算法是實際上是一樣的......並且查詢在同一時間完成。「。 – eggyal

0

子查詢是真的很慢infact joins存在!

DELETE table1 
FROM table1 LEFT JOIN table2 ON table1.id = table2.id 
WHERE table2.id is null 
0

從表格中刪除數百萬條記錄總是會有性能問題;你需要檢查,如果表中有 - 1.限制 2.觸發器,& 3.指數

就可以了。這些東西會讓你的刪除更慢...

請在此活動前禁用它們。您還應該檢查「待刪除」記錄與整個表格卷的比率。如果要刪除的記錄數量超過整個表格數量的50%,那麼您應該考慮以下方法 -

  1. 創建一個包含要從原始表中保留的記錄的臨時表。
  2. 放下原始表格。
  3. 將臨時表重命名爲原始表。

在開始上述方法之前,請確保您擁有依賴於此原始表的每個對象的定義副本,例如約束,索引,觸發器等。您可能還需要檢查您要刪除的表格有任何孩子。

完成此活動後,您可以再次啓用約束,索引,觸發器!

謝謝, Aditya

+0

禁用索引時要小心:有些可能會大大加快此操作。禁用約束和觸發器時還要小心:它們可能對維護數據一致性至關重要。 – eggyal

+0

感謝您的評論。看看這個問題,我認爲用戶想要刪除數百萬條記錄,並且刪除這麼大的卷並不是每天都會發生的。這就是我認爲它是一次性活動並且建議禁用索引和約束的原因 –

+0

但是索引在相應表格中的'id'上將會有*戲劇性*的幫助。禁用這些索引將是一個可怕的想法。 – eggyal