我应该担心表中的1B +行吗?

Chr*_*ini 2 mysql sql database database-design ruby-on-rails-3

我有一张表可以跟踪文章视图.它包含以下列:

id, article_id, day, month, year, views_count.
Run Code Online (Sandbox Code Playgroud)

假设我想跟踪每篇文章的每日观看次数.如果我有1000个用户写的文章.行数将计算为:

365 (1 year) * 1,000 => 365,000
Run Code Online (Sandbox Code Playgroud)

哪个也不错.但是,请说.文章数量增长到1M.随着时间的推移,到了3年.行数将计算为:

365 * 3 * 1,000,000 => 1,095,000,000
Run Code Online (Sandbox Code Playgroud)

显然,随着时间的推移,这张桌子将继续增长.并且非常快.这会引起什么问题?或者我不应该担心,因为RDBM处理这种情况很常见?

我计划在报告中使用观看数据.要么将其分解为数月甚至数年.我应该担心表中的1B +行吗?

Cyl*_*ric 5

问自己(或您的利益相关者)的问题是:您是否真的需要对旧数据进行1天分辨率?

了解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
Run Code Online (Sandbox Code Playgroud)

然后,您将定期创建一个汇总这些数据的新记录,在此示例中只是该月的总计数

year | month | day | count | type
-----+-------+-----+-------|------
2011 |    12 |   0 |    72 | month
Run Code Online (Sandbox Code Playgroud)

或者每天的平均值:

year | month | day | count | type
-----+-------+-----+-------+------
2011 |    12 |   0 |   2.3 | month
Run Code Online (Sandbox Code Playgroud)

当然,你可能需要一些标志,表示该数据的"总结"的地位,在这种情况下,我用了一个"类型"栏中查找"原始"记录和处理的记录,让您清除了一天的记录按要求.

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
Run Code Online (Sandbox Code Playgroud)

(我还没有测试过那个查询,这只是一个例子)