MySQL 大表批量删除

Tia*_*ng 9 mysql delete mysql-5.5

我有一个通知表,其中包含 Amazon RDS 中大约 1 亿行的主机,IOPS 为 1000,我想删除那些超过一个月的行。

如果我这样做DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);,将占用所有 IOPS,该过程将花费数小时,并且由于“超出锁定等待超时;尝试重新启动事务”而无法插入许多新条目。

我试图做这里描述的方式:http : //mysql.rjweb.org/doc.php/deletebig 但是,我使用 UUID 而不是增量 ID。

在不影响插入/更新新数据的情况下删除这些行的正确有效的方法是什么?

Rol*_*DBA 12

做一个临时表,把它进进出出,把最近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);
Run Code Online (Sandbox Code Playgroud)

在你的下班时间,放下旧桌子

DROP TABLE NOTIFICATION_OLD;
Run Code Online (Sandbox Code Playgroud)

以下是像这样执行 DELETE 的优点

  1. NOTIFICATION 通过在空表中切换的方式快速清空。
  2. NOTIFICATION 可立即用于新的 INSERT
  3. 剩余的 30 天将重新添加到NOTIFICATION新的 INSERT 中。
  4. 删除旧版本NOTIFICATION不会干扰新的 INSERT
  5. 注意:我之前曾建议对表 DELETE 进行诱饵和切换:(请参阅我 2012 年 7 月 19 日的帖子:优化 MySQL MEMORY 表上的 DELETE 查询

试一试 !!!