我想从 MySql 数据库中的大表(~500K 记录)中删除大量记录(~200K)。
我想让这个调用尽可能高效,因为我不希望数据库在执行调用时变得“无响应”。我需要删除“早于”10 天的记录(根据created_at
列),目前我使用:
delete from table_name where created_at < DATE_SUB(CURDATE(),INTERVAL 10 DAY)
该表也有一个主键id
如果有帮助的话。
有什么想法吗?
我也面临着同样的挑战。
没有主键,但有索引created_at
字段,无法从 100Mio 行表 (InnoDB) 中删除最旧的 10Mio 条目。由于表处于在线状态并且仍然接收插入,它不断地因锁溢出而失败。
为了解决这个问题,我创建了一个存储过程来逐步解决该工作:
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 $$
这仍然运行很长一段时间,但不会损害仍在命中表的并发插入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)