我有一张记录文章浏览量的表。它有以下列:
id, article_id, day, month, year, views_count.
假设我想记录每篇文章每天的浏览量。如果我有1000篇用户写的文章。行数将计算为:
365 (1 year) * 1,000 => 365,000
这也不算太糟。但可以这么说。文章数量增长到100万篇,而且随着时间的推移,增长到3年。行数将计算为:
365 * 3 * 1,000,000 => 1,095,000,000
显然,随着时间的推移,这张桌子将继续增长。而且很快。这会导致什么问题?或者我不应该担心,因为RDBM通常处理这样的情况?
我计划在我们的报告中使用视图数据。或者把它分解成几个月甚至几年。我应该担心表中的1b+行吗?
最佳答案
要问自己(或利益相关者)的问题是:您真的需要对旧数据进行为期一天的解析吗?
查看MRTG等产品如何通过RRD进行日志记录。理论是,你不可能无限期地存储所有的数据,而是定期将它们聚合成越来越大的摘要。
这允许你在最后5分钟内有1秒的分辨率,然后在最后一小时平均5分钟,然后一天每小时一次,一个月每天一次,等等。
例如,如果你有一篇文章的一堆这样的记录:
year | month | day | count | type
-----+-------+-----+-------|------
2011 | 12 | 1 | 5 | day
2011 | 12 | 2 | 7 | day
2011 | 12 | 3 | 10 | day
2011 | 12 | 4 | 50 | day
然后在定期创建一个新记录,总结这些数据,在本例中,仅为当月的总计数
year | month | day | count | type
-----+-------+-----+-------|------
2011 | 12 | 0 | 72 | month
或平均每天:
year | month | day | count | type
-----+-------+-----+-------+------
2011 | 12 | 0 | 2.3 | month
当然,您可能需要一些标志来指示数据的“汇总”状态,在本例中,我使用了“类型”列来查找“原始”记录和已处理的记录,允许您根据需要清除日记录。
INSERT INTO statistics (article_id, year, month, day, count, type)
SELECT article_id, year, month, max(day), sum(count), 'month'
FROM statistics
WHERE type = 'day'
GROUP BY article_id, year, month, type
(我还没有测试这个查询,它只是一个例子)