尝试删除1000个日志条目,但是如果只有999个可用,我会超时

时间:2019-04-03 23:13:48

标签: mysql sql-delete

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

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

我正在尝试一次从表Log中删除1000行,以便可以以受控方式进行操作,从而不会占用mysql服务器的所有资源。

现在是问题所在。当有成千上万的行要删除时,它可以很好地工作。似乎由于我是通过ID来排序的,ID是一个auto_increment主键,它将从头开始,并根据需要进行处理。另外LogTime也在增加,因此第一行具有最早的时间戳。

现在是问题,如果我只有999行应根据LogTime

有什么办法告诉mysql只能按照搜索顺序删除,直到找不到更多匹配项为止。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

相关问题