5

如果您正在执行最小/最大/平均查询,您更喜欢使用聚合表还是简单地查询原始表中的一系列行?

这显然是一个非常开放的问题,没有一个正确的答案,所以我只是在寻找人们的一般建议。假设原始数据表由时间戳、数字外键(比如用户 ID)和十进制值(比如购买金额)组成。此外,假设表中有数百万行。

我都做了,我很伤心。一方面,聚合表给了我更快的查询速度,但代价是增加了额外的表。显示聚合范围的当前值要么需要完全返回原始数据表,要么需要组合更细粒度的聚合。我发现在应用程序代码中跟踪查询哪个聚合表的时间比您认为的要多,并且需要更改架构,因为原始聚合范围总是不够的(“但我想看看我们在过去 3 个支付期的销售额!”)。

另一方面,从原始数据中查询可能会非常慢,但让我对数据范围非常灵活。当范围边界发生变化时,我只需更改查询,而不必重建聚合表。同样,应用程序代码需要更少的更新。我怀疑如果我在索引方面更聪明(即始终具有良好的覆盖索引),我将能够减少从原始数据中选择的惩罚,但这绝不是灵丹妙药。

无论如何我可以两全其美吗?

4

3 回答 3

3

我们遇到了同样的问题,也遇到了您遇到的同样问题。我们最终将报告切换到分析服务。MDX 和分析服务本身有一个学习曲线,但它很棒。我们发现的一些好处是:

  1. 您可以灵活地以任何方式查询。以前我们必须构建特定的聚合,但现在一个多维数据集可以回答我们所有的问题。
  2. 多维数据集中的存储远小于详细数据。
  3. 与聚合相比,构建和处理多维数据集所花费的时间更少,并且在数据库服务器上产生的负载也更少。

一些缺点:

  1. 围绕构建立方体和学习 MDX 有一个学习曲线。
  2. 我们必须创建一些工具来自动处理多维数据集。

更新:由于您使用的是 MySql,您可以查看Pentaho Mondrian,这是一个支持 MySql 的开源 OLAP 解决方案。不过我从来没有用过,所以我不知道它是否适合你。有兴趣知道它是否对您有用。

于 2009-12-23T23:36:21.063 回答
0

我总是倾向于原始数据。一旦聚合,您将无法返回。
与删除无关- 除非有最简单的聚合数据集,否则您无法准确地将数据恢复/转置回原始数据。

理想情况下,我会使用物化视图(假设数据可以适应约束),因为它实际上是一个表。但 MySQL 不支持它们,因此下一个考虑将是具有计算列的视图,或更新实际表的触发器。

于 2009-12-24T00:42:44.693 回答
0

它有助于选择一个好的主键(即 [user_id, used_date, used_time])。对于恒定的 user_id,在 used_date 上执行范围条件会非常快。

但是随着表的增长,您可以通过聚合到像 [user_id, used_date] 这样的表来减小表大小。对于时间无关紧要的每个范围,您都可以使用该表。另一种减少表大小的方法是归档您不再(允许)查询的旧数据。

于 2009-12-24T10:36:00.417 回答