以滚动方式从MySQL中删除旧行的最佳方法是什么?

Bra*_*yer 47 mysql

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

  • 不,“ON COMPLETION PRESERVE”与“EVERY”子句会做同样的事情。两种不同的方法。 (3认同)

The*_*ail 32

查看MySQL分区:

通过删除仅包含该数据的分区(或多个分区),通常可以轻松地从分区表中删除失去其实用性的数据.相反,在某些情况下,通过添加一个或多个新分区来特别存储该数据,可以极大地促进添加新数据的过程.

请参阅本节以获得有关如何应用它的一些想法:

MySQL分区修剪

还有这个:

按日期划分:快速操作方法

  • 只是想更新我现在有这个工作,这太棒了!特别是因为分区修剪意味着只要我对SELECTS设置了限制,一旦它过时,我正在删除的分区甚至都不会被访问.这个资源有很多帮助:http://www.slideshare.net/datacharmer/mysql-partitions-tutorial (4认同)