Mysql
MySQL中大表的批量刪除
我有一個通知表,其中包含大約 1 億行託管在 Amazon RDS 中,IOPS 為 1000,我想刪除這些超過一個月的行。
如果我這樣做
DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
,將佔用所有 IOPS,該過程將花費數小時,並且由於“超出鎖定等待超時;嘗試重新啟動事務”而無法插入大量新條目。我試圖按照此處描述的方式進行操作:http: //mysql.rjweb.org/doc.php/deletebig 但是,我使用的是 UUID 而不是增量 ID。
在不影響插入/更新的新數據的情況下,刪除這些行的正確有效方法是什麼?
製作一個臨時表,將其切換進出,並將最近 30 天的數據複製到其中。
# # Make empty temp table # CREATE TABLE NOTIFICATION_NEW LIKE NOTIFICATION; # # Switch in new empty temp table # RENAME TABLE NOTIFICATION TO NOTIFICATION_OLD,NOTIFICATION_NEW TO NOTIFICATION; # # Retrieve last 30 days data # INSERT INTO NOTIFICATION SELECT * FROM NOTIFICATION_OLD WHERE CreatedAt >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
在你的下班時間,放下舊桌子
DROP TABLE NOTIFICATION_OLD;
以下是像這樣進行 DELETE 的優點
NOTIFICATION
通過在空表中切換來快速清空。NOTIFICATION
可立即用於新的 INSERT- 剩餘的 30 天將重新添加
NOTIFICATION
,同時可以進行新的 INSERT。- 刪除舊版本
NOTIFICATION
不會干擾新的 INSERT- 注意:我之前曾建議對錶 DELETE 進行 bait-and-switch 操作:(請參閱我 2012 年 7 月 19 日的文章:Optimizing DELETE Query on MySQL MEMORY Table)
試一試 !!!