一尘不染

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

sql

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

我曾考虑过在插入,更新或删除行时使用触发器来增加和减少存储的总数。但是(我假设)这样做的一个问题是,如果表被截断,那么总数将不会为零。我可以忍受,但还有其他需要注意的地方吗?或者,如果有更好的方法可以解决此问题,请告诉我。


阅读 171

收藏
2021-03-08

共1个答案

一尘不染

从理论上讲,只要满足以下条件,触发器就可以保持摘要表的准确更新:

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

还:

  • 您必须使用正确的初始值为汇总表添加种子
  • 您必须对源表和摘要表都使用InnoDB,因此更新是原子的

维护汇总表是反规范化的一个示例。与所有非规范化一样,这会带来数据异常的风险。您负责维护数据完整性;数据库在帮助您方面有很大的限制。

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

2021-03-08