这就是我到目前为止所尝试的:
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只能按照搜索顺序删除,直到找不到更多匹配项为止。
答案 0 :(得分:2)
在您的LogTime
列上放置一个索引。然后从您的DELETE查询中删除ORDER BY ID
。然后,删除您的1000行(或更少)行的批次应该很有效。
如果您必须保证删除批处理按照严格的ID顺序进行,则您仍需要我建议的索引。您的查询将很好。
但是,如果您用于删除批次的方案不需要维护ID顺序,那是一个更好的选择,尤其是在表格处于活动状态时。如果您重新运行DELETE查询直到删除0行,则不必担心严格的ID顺序。
较小的批次(50或100)将使您的表占用的时间更短,从而减少了表的其他用户的延迟。并且在WHERE
子句中使用单个索引列可以减少出现死锁的可能性。