我发现自己想要在很多应用程序中滚动删除早于(x)-days的行.在高流量桌上最有效地做到这一点的最佳方法是什么?
例如,如果我有一个存储通知的表,我只想保留7天.或高分我只想保持31天.
现在我保留一行存储发布的纪元时间,并运行一个每小时运行一次的cron作业,并以如下增量删除它们:
DELETE FROM my_table WHERE time_stored < 1234567890 LIMIT 100
Run Code Online (Sandbox Code Playgroud)
我这样做直到mysql_affected_rows返回0.
我曾经一次做到这一切,但这导致应用程序中的所有内容在INSERTS堆积的情况下挂起30秒左右.添加LIMIT有助于缓解这一点,但我想知道是否有更好的方法来做到这一点.
小智 62
尝试创建将在您想要的时间间隔后自动在数据库上运行的事件.
下面是一个示例:如果要从某个表'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)
Run Code Online (Sandbox Code Playgroud)
我们需要添加ON COMPLETION PRESERVE以在每次运行后保留事件.您可以在此处找到更多信息:http://www.mysqltutorial.org/mysql-triggers/working-mysql-scheduled-event/