我想从MySql DB中的大表(~500K记录)中删除大量记录(~200K).
我希望尽可能高效地进行此调用,因为我不希望DB在执行调用时变得"无响应".
我需要删除"超过10天"的记录(根据created_at列),目前我使用:
delete from table_name where created_at < DATE_SUB(CURDATE(),INTERVAL 10 DAY)
Run Code Online (Sandbox Code Playgroud)
id如果有帮助,该表还有一个主键.
有什么想法吗?
joe*_*rgd 10
我面临同样的挑战.如果没有主键,但该created_at字段上有索引,则无法从100Mio行表(InnoDB)中删除最旧的10Mio条目.由于表在线并仍然接收INSERTS,因此锁定溢出始终失败.
为了解决这个问题,我创建了一个以递增方式处理作业的存储过程:
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 $$
Run Code Online (Sandbox Code Playgroud)
这仍然会运行很长一段时间,但不会损害仍然会遇到表的并发INSERTS.
你可以试试这个:
1) 首先找到所需日期的第一个 id 值:
select id from table_name where created_at = DATE_SUB(CURDATE(),INTERVAL 10 DAY) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
2)接下来批量删除:
DELETE FROM table_name where id<"id_found_on_step_1" LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
在 id_found_on_step_1 上输入您在步骤 1 中找到的 id 值。您可以尝试 10000 或低于 1000。这取决于每个删除命令将花费多少时间。
此 DELETE 应该更快,因为它的 WHERE 语句使用主键。
| 归档时间: |
|
| 查看次数: |
12228 次 |
| 最近记录: |