使用触发器作为SQL聚合函数替代?

问题描述 投票:2回答:1

我有一个包含数百万行的表,并且经常需要知道其中一列的总和。在查询中使用SUM太慢,因为它需要触摸整个表。有没有一种万无一失的方法来保持准确的总数而不在每个查询中计算它?

我想过在插入,更新或删除行时使用触发器来增加和减少存储的总数。虽然这是一个问题(我假设),如果表被截断,那么总数不会变为零。我可以忍受,但还有什么值得注意的吗?或者如果有更好的方法可以解决这个问题,请告诉我。

mysql sql database
1个回答
2
投票

从理论上讲,触发器可以准确地更新汇总表,只要:

  • 您不禁用触发器
  • 您不直接更新摘要表
  • 您不通过TRUNCATE TABLE更改源数据(如您所述)

也:

  • 您必须使用正确的初始值为摘要表设定种子
  • 您必须将InnoDB用于源表和摘要表,因此更新是原子的

维护汇总表是denormalization的一个例子。与所有非规范化一样,这可能会导致数据异常。您负责维护数据完整性;数据库受限于它可以帮助您做到这一点。

我建议您不时要仔细检查汇总表(例如每小时可能就足够了),以确保它没有不同步,如果有,则更正它。这取决于您,因为数据库无法为您检查。

© www.soinside.com 2019 - 2024. All rights reserved.