mysql - 从 MySQL 滚动删除旧行的最佳方法是什么?

我发现自己想在很多应用程序中滚动删除早于 (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/

相关文章:

sql - 在 MySQL 中重命名外键列

mysql - 左外连接和左连接一样吗?

mysql - 将 MySQL 数据库置于版本控制之下?

mysql - 为什么 MySQL 会在 FULL OUTER JOIN 上报告语法错误?

mysql - 何时在 mysql 中使用 TEXT 而不是 VARCHAR

mysql - 拒绝访问;您需要(至少一个) super 权限才能执行此操作

mysql - 如何将两列与mysql中的现有列名合并为一?

sql - 如何选择一个空的结果集?

mysql - 如何在 MySQL 中获得减去 6 周的时间戳?

mysql - 在 MySQL 中存储 IPv6 地址