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

时间:2018-01-01 07:36:04

标签: mysql sql database

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

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

1 个答案:

答案 0 :(得分:2)

理论上,触发器可以保持汇总表的准确更新,只要:

  • 您不会停用触发器
  • 您不能直接更新摘要表
  • 您不会通过TRUNCATE TABLE(如您所知)对源数据进行更改

此外:

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

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

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