移动过期的物品?

时间:2009-05-24 17:24:45

标签: mysql ruby-on-rails model archiving

我有一个有expiry_date的模型Post。我想知道是什么 在这种情况下管理可伸缩性的最佳方法。 2个选项:

  1. 每当我想从表中选择SELECT时,我需要包含where expiry_date>现在。如果表Post像怪物一样长大,我会进去 麻烦。想象一下3年或更长时间。索引也很大。

  2. 拥有触发器,cron作业或插件(如果存在) 围绕表并将过期的项目移动到新表Post_Archive。 这样,我在主表中只维护当前的帖子,这意味着 超过3年,我不会像选项1那样糟糕。

2 个答案:

答案 0 :(得分:1)

如果你需要连续存档数据(你的#2)而不是一个好的选项是MaatKit。

http://www.maatkit.org/

它可以“蚕食”数据块中的数据,而不是运行消耗大量资源的大量查询(并避免污染密钥缓存)。

是的,你可以从cron运行一个Maatkit工作。

与此同时,如果你想同时做#1,你可以实现一个方便地包装“WHERE expiry_dat> NOW”条件的视图,这样你就不必将它全部包含在你的代码中。

答案 1 :(得分:0)

一个cron工作对我来说听起来不错,可以通过直接向mysql命令提供一个简单的脚本来完成,例如,大致:

CREATE TEMPORARY TABLE Moving
SELECT * FROM Post WHERE expiry > NOW();

INSERT INTO Post_Archive
SELECT * FROM Moving;

DELETE FROM Post
WHERE id IN (SELECT id FROM Moving);

DROP TEMPORARY TABLE Moving;