Mysql

MySQL中大表的批量刪除

  • July 18, 2017

我有一個通知表,其中包含大約 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 的優點

  1. NOTIFICATION通過在空表中切換來快速清空。
  2. NOTIFICATION可立即用於新的 INSERT
  3. 剩餘的 30 天將重新添加NOTIFICATION,同時可以進行新的 INSERT。
  4. 刪除舊版本NOTIFICATION不會干擾新的 INSERT
  5. 注意:我之前曾建議對錶 DELETE 進行 bait-and-switch 操作:(請參閱我 2012 年 7 月 19 日的文章:Optimizing DELETE Query on MySQL MEMORY Table

試一試 !!!

引用自:https://dba.stackexchange.com/questions/83109