我发现自己想在很多应用程序中滚动删除早于 (x) 天的行。在人流量大的 table 上最有效地执行此操作的最佳方法是什么?
例如,如果我有一个存储通知的表,并且我只想保留这些通知 7 天。或者我只想保留 31 天的高分。
现在我保留一行存储发布的纪元时间并运行一个每小时运行一次的 cron 作业并以如下增量删除它们:
DELETE FROM my_table WHERE time_stored < 1234567890 LIMIT 100
我这样做直到 mysql_affected_rows 返回 0。
我曾经一次完成所有操作,但这导致应用程序中的所有内容在 INSERTS 堆积时挂起 30 秒左右。添加 LIMIT 可以缓解这种情况,但我想知道是否有更好的方法来做到这一点。
最佳答案
尝试创建将在您想要的时间间隔后自动在数据库上运行的事件。
这是一个例子: 如果要从某个表“tableName”中删除超过 30 天的条目,则具有列条目“datetime”。然后每天运行以下查询,这将执行所需的清理操作。
CREATE EVENT AutoDeleteOldNotifications
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
ON COMPLETION PRESERVE
DO
DELETE LOW_PRIORITY FROM databaseName.tableName WHERE datetime < DATE_SUB(NOW(), INTERVAL 30 DAY)
我们需要添加 ON COMPLETION PRESERVE
以在每次运行后保留该事件。您可以在这里找到更多信息:http://www.mysqltutorial.org/mysql-triggers/working-mysql-scheduled-event/
https://stackoverflow.com/questions/9472167/