首页 > 解决方案 > 尝试删除 1000 个日志条目,但如果只有 999 个可用,我会超时

问题描述

所以这是我到目前为止所尝试的:

DELETE FROM Log WHERE LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY ID LIMIT 1000

我试图一次从表 Log 中删除 1000 行,以便可以以受控方式完成,并且不会占用 mysql 服务器的所有资源。

现在来解决问题。当有数千行要删除时,它可以完美地工作。似乎因为我按 ID 排序,这是一个 auto_increment 主键,它将从头开始并根据需要进行。LogTime 也在增加,因此第一行具有最旧的时间戳。

现在的问题是,如果我只有 999 行应该根据 LogTime < DATE_SUB(NOW(), INTERVAL 30 DAY) 检查删除。然后它将在整个表中搜索最后 1 行。

有没有办法告诉mysql只删除,直到它没有找到更多匹配项,按照它搜索的顺序?

标签: mysqlsql-delete

解决方案


LogTime在您的列上放置一个索引。然后ORDER BY ID从您的 DELETE 查询中删除。然后删除 1000(或更少)行的批次应该是有效的。

如果您必须保证您的删除批次按照严格的 ID 顺序进行,您仍然需要我建议的索引。您的查询会很好。

但是,如果您的批量删除方案不需要维护 ID 顺序,这是一个更好的选择,尤其是在表处于活动状态时。如果您重新运行 DELETE 查询直到它删除 0 行,您不必担心严格的 ID 顺序。

较小的批次(50 或 100 个)将占用您的桌子更短的时间,从而减少桌子其他用户的延迟。在子句中使用单个索引列WHERE可以减少死锁的机会。


推荐阅读