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

Dai*_*iBu 5 mysql sql database

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

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

Bil*_*win 3

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

  • 您没有禁用触发器
  • 您不直接更新汇总表
  • 您不通过 TRUNCATE TABLE 更改源数据(正如您所指出的)

还:

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

维护汇总表是非规范化的一个示例。与所有非规范化一样,这存在数据异常的风险。您有责任维护数据完整性;数据库能帮助你做到这一点的程度是有限的。

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