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 的优点
NOTIFICATION 通过在空表中切换的方式快速清空。NOTIFICATION 可立即用于新的 INSERTNOTIFICATION新的 INSERT 中。NOTIFICATION不会干扰新的 INSERT试一试 !!!