我想从我的MySql DB中的大表(~500 K记录)中删除大量的记录(~200 K)。
我希望尽可能高效地进行这个调用,因为我不希望DB在执行调用时变得“没有响应”。我需要删除超过10天(根据created_at栏)的记录,目前我使用:
delete from table_name where created_at < DATE_SUB(CURDATE(),INTERVAL 10 DAY)如果有帮助,该表还具有主键id。
有什么想法吗?
发布于 2011-03-25 09:07:30
有一个WHERE条件,在created_at字段上添加一个索引。
发布于 2013-08-10 08:43:46
我也面临着同样的挑战。没有主键,但在created_at字段上有索引,因此无法从100 row行表(InnoDB)中删除最古老的10 row条目。由于该表处于联机状态,并且仍然接收插入,因此在锁溢出时,它经常失败。
为了解决这个问题,我创建了一个存储过程,它以增量的方式处理作业:
mysql> CREATE PROCEDURE delete_accesslog_incrementally()
-> MODIFIES SQL DATA
-> BEGIN
-> REPEAT
-> DELETE FROM tbl_name
-> WHERE created_at < DATE_SUB(CURDATE(),INTERVAL 10 day)
-> LIMIT 20000;
-> UNTIL ROW_COUNT() = 0 END REPEAT;
-> END $$这仍然会运行很长一段时间,但不会损害仍然命中表的并发插入。
发布于 2012-01-04 12:45:15
你可以试试这个:
1)首先查找所需日期的第一个id值:
select id from table_name where created_at = DATE_SUB(CURDATE(),INTERVAL 10 DAY) LIMIT 1;2)下一批删除:
DELETE FROM table_name where id<"id_found_on_step_1" LIMIT 1000; 在id_found_on_step_1上,将您在步骤1中找到的id值放在第1步。您可以尝试10000或低于1000。这取决于每个delete命令所需的时间。
这个删除应该更快,因为它的WHERE语句使用主键。
https://stackoverflow.com/questions/5430256
复制相似问题