我有一个我定期抓取的网页表(因为网页会定期更改),我会跟踪首次发现网页的时间以及上次更新的时间。表格设计大致为:
+--------+---------+------------+--------------+---------+---------+
| 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秒内更新过的行?
谢谢!
答案 0 :(得分:1)
最简单的解决方案是在last_updated
上创建索引。
效果很好。无需将时间花在一些自定义跟踪逻辑上(除非您必须知道您正在做什么以及为什么)。
如果您使用MongoDB,我建议您使用capped collections。这是一种专门为此类操作而制作的集合。您为此类集合设置了最大大小并开始写入数据。当它已满时,最旧的条目将被覆盖。我不知道MySQL中是否有类似的功能。
您可以考虑使用mongo来存储这个小的页面集合,并通过不在last_updated
创建索引来节省RAM。