查找最近更新的行的快速方法是什么?

时间:2011-12-31 00:58:52

标签: mysql

我有一个我定期抓取的网页表(因为网页会定期更改),我会跟踪首次发现网页的时间以及上次更新的时间。表格设计大致为:

+--------+---------+------------+--------------+---------+---------+
| id     | url     | discovered | last_updated | title   | text    |
+--------+---------+------------+--------------+---------+---------+
| int    | varchar | datetime   | datetime     | varchar | varchar |
+--------+---------+------------+--------------+---------+---------+

现在我只是索引id和url(实际上,URL的SHA1哈希是准确的)。但是,我经常想查阅“最新”的文章。即,那些在最后N秒内更新的(N通常是一天中的秒数)。

问题是随着表的增长,查询开始变慢。我想知道这个问题的正确解决方案是什么?我可以索引last_updated,或者我可以创建一个新表来跟踪每个网页的last_updated时间。例如,创建此辅助表:

+--------+------------+--------------+
| id     | webpage_id | last_updated |
+--------+------------+--------------+

然后我可以跟踪这个新表中从id到last_updated的映射并执行:

select webpage_id from LastUpdatedTable where id > (ID_FOR_N_SECONDS_AGO)

或者是否有更优雅的解决方案可以快速查找在过去N秒内更新过的行?

谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是在last_updated上创建索引。

效果很好。无需将时间花在一些自定义跟踪逻辑上(除非您必须知道您正在做什么以及为什么)。

如果您使用MongoDB,我建议您使用capped collections。这是一种专门为此类操作而制作的集合。您为此类集合设置了最大大小并开始写入数据。当它已满时,最旧的条目将被覆盖。我不知道MySQL中是否有类似的功能。

您可以考虑使用mongo来存储这个小的页面集合,并通过不在last_updated创建索引来节省RAM。