【发布时间】:2012-03-17 08:21:00
【问题描述】:
我发现自己想在很多应用程序中滚动删除早于 (x) 天的行。在人流量大的桌子上最有效地执行此操作的最佳方法是什么?
例如,如果我有一个存储通知的表,并且我只想保留这些通知 7 天。或者我只想保留 31 天的高分。
现在我保留一行存储发布的纪元时间并运行一个每小时运行一次的 cron 作业,并以如下增量删除它们:
DELETE FROM my_table WHERE time_stored < 1234567890 LIMIT 100
我这样做直到 mysql_affected_rows 返回 0。
我曾经一次完成所有操作,但这导致应用程序中的所有内容在 INSERTS 堆积时挂起 30 秒左右。添加 LIMIT 可以缓解这种情况,但我想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
您是否考虑过在非工作时间(凌晨 12 点至凌晨 2 点)运行 cron 作业,或者您当时仍在处理繁忙的交通?
-
+1 @MikePurcell 我通常在活动最低时安排 cron 作业。
-
您是否在
time_stored列上设置了索引?没有一个可能会导致您的DELETE查询缓慢。 -
如果要删除行:(过多)表中各列的索引过多也会导致删除缓慢,因为这些索引也必须更新。
-
您是否在删除后重新优化您的表?它们可能是超级碎片化的。
标签: mysql