从大表中删除大量记录的有效方法

Ran*_*Ran 1 mysql performance

我想从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.


dan*_*gel 5

你可以试试这个:

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 语句使用主键。