在我的 mariaDB 資料庫中處理大型資料集。我有兩個表,其中表 A 包含 5700 萬行,表 B 包含大約 500 行。表 B 是與表 A 中的列相關的 ids 的子集。我想刪除 A 中沒有相應 ID 的所有行表B.
範例表 A:
classification_id | 姓名 |
---|---|
20 | 梅賽德斯 |
30 | 川崎 |
80 | 徠茲 |
70 | 惠普 |
範例表B:
classification_id | 類型 |
---|---|
20 | 汽車 |
30 | 自行車 |
40 | 公車 |
50 | 船 |
因此,在此範例中,表 A 中的最後兩行將被刪除(或將建立僅包含前兩行的鏡像表,這也可以)。
我嘗試使用內部聯接執行第二個查詢,但此查詢花了幾分鐘才給出記憶體不足異常。
關於如何解決這個問題有什麼建議嗎?
由於您說過濾表包含相對較少的行數,因此最好的選擇是創建一個單獨的表,其中包含與原始表
A
相同的列以及與您的匹配的行criteria ,然後替換原始表並刪除它。另外,對於如此數量的 ID,您可能想要使用WHERE IN ()
而不是聯接 - 只要您在那裡使用的欄位已建立索引,它通常會方式 em> 更快。將所有內容放在一起:需要注意的事項:
A
有任何索引或外鍵,這些將不會被複製 - 因此您必須手動重新建立它們。我建議先執行SHOW CREATE TABLE A
並記下其結構。或者,您可以考慮使用SHOW CREATE TABLE A
的輸出作為範本明確建立表格new_A
,然後執行INSERT INTO new_A SELECT ... code> 而不是
CREATE TABLE new_A AS SELECT ...
並在此之後使用相同的查詢。試試這個: