【问题标题】:How best to recalculate group by values如何最好地重新计算按值分组
【发布时间】:2011-10-22 04:38:38
【问题描述】:

我有一个存储大型表的总和值的表。我不会即时计算它们,因为我经常需要它们。

更新这些值的最佳方法是什么?

  1. 我可以从表中删除相关行,在所有相关行上按总和进行完整分组,然后插入新数据。

  2. 或者我可以在主表上索引一个时间戳列,然后只对最新值求和并将它们添加到现有数据中。这很复杂,因为某些总和不存在,因此插入和更新查询都需要运行。

我知道答案取决于数据的细节,但我想知道的是是否值得采用第二种方法;如果在第一个示例中汇总了数百万行,而在第二个示例中只有数十行,那么第二个示例的执行速度会显着加快吗?

【问题讨论】:

  • 在您的情况下“大”有多大?如果少于数亿,您可以添加适当的索引和缓存机制并执行 select count(*) from 而无需担心任何事情
  • @keymone 你确定。这将是数百万,但这个问题表明即使这是一个问题,因为计数没有被索引。 stackoverflow.com/questions/1332624/…
  • 触发器的问题是,如果您的表非常大 - 它们的流量很大。并且大量的流量会产生大量的触发事件。并且每个触发事件都会生成另一个对数据库的写入。所以值得吗?如果您的计数查询不是很复杂,那么您只需索引列即可轻松摆脱。

标签: mysql


【解决方案1】:

我会做这样的事情 (INSERT UPDATE):

mysql_query("
INSERT INTO sum_table (col1, col2)
SELECT id, SUM(value)
FROM table
GROUP BY id
ON DUPLICATE KEY UPDATE col2 = VALUES(col2)
");

如果您需要更多示例,请告诉我。

【讨论】:

  • 谢谢 Robin,ON DUPLICATE KEY 对我来说是一个新的选择,这无疑简化了第二个选项。
【解决方案2】:

对我来说有几种方法:

  • 制作一个应该是最新的视图(我不知道你是否可以在mysql中做具体的视图)
  • 使用触发器(以更新/删除/插入为例)或在(夜间,因此数据将是 1 天前)使用批处理创建一个最新的表
  • 创建一个存储过程,它将仅检索和计算所需的数据。

【讨论】:

    【解决方案3】:

    您可以尝试在更新/删除时使用触发器。然后检查插入或删除的值,并根据它修改第二个表中的总和。

    http://dev.mysql.com/doc/refman/5.0/en/triggers.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2013-03-31
      • 1970-01-01
      • 2017-09-23
      • 2021-09-07
      相关资源
      最近更新 更多