【发布时间】:2014-06-19 09:39:52
【问题描述】:
目前我有情况,这让我很害怕。我在数据库中有 20k 行,这甚至不是数据的 1%,我将在接下来的 3 个月内拥有。每行代表一个带有一些数据的对象(我们称之为Object1)。另外,我有每个 Object1 的统计数据表,我们称之为 Object1Stats,它位于 MongoDB 中。我每天都有 Object1Stats,因此要获得总统计数据,我应该对 Object1 的每个 Object1Stats 求和。
问题是:我经常需要预先计算这些数据。例如,将其显示给用户,能够按统计信息对 Object1 集合进行排序。我可以加载它并在代码中进行排序,但是例如使用 500 万个 Object1,它会太昂贵。
所以,我想到了每个 Object1 每小时预先计算统计数据(Object1Stats 每小时更新两次)的想法。但是这个过程让我害怕它需要执行所有操作的时间......我应该获取每个 Object1,向 MongoDB 发送查询以汇总 Object1Stats,为 Object1 进行 SQL UPDATE。重复此操作至少 300 万次。
这里有两个瓶颈:MongoDB 中 sum(MapReduce) 的计算和 Postgre 中的 SQL 更新查询。我现在不能真正加速 MapReduce(我认为它会很好),但我正在考虑 SQL 更新。
有什么想法或建议吗?我接受任何东西,甚至是使用不同数据库或方法的建议。
另外,我不能只为对象添加新的统计数据,因为前一天的统计数据可以经常更改,前几天的统计数据也可以更改。
【问题讨论】:
-
数据建模中有一条经验法则:“不要存储聚合”。如果您必须存储它们,请确保它们可以增量更新(例如,通过 detail 表上的触发器)
标签: sql mongodb postgresql optimization database