如何优化表以选择SUM?

时间:2017-03-13 14:19:19

标签: mysql sql sum query-optimization

假设我有一张表,其中包含数百万条记录银行账户交易的记录。 (这不是银行账户,但对于这个问题而言足够接近。)

  • user(拥有此记录的用户的ID。)
  • 金额(添加的整数金额(+ ve)或删除(-ve)。)
  • (其他领域)

我可以运行这些SELECT命令来获取任何特定用户或所有用户的“余额”......

SELECT SUM(amount) AS balance FROM MyTable where user = (id)
SELECT user, SUM(amount) AS balance FROM MyTable GROUP BY user

这样做的问题是,添加更多记录需要更长时间,而且表格会增长。

我怀疑(恐惧?)答案是添加一个更新第二个每用户表的触发器。但是,我想知道,这种模式对于银行业务或会计系统是否足够普遍,以至于数据库系统具有为此用途而设计的内置优化?

2 个答案:

答案 0 :(得分:0)

首先,我将从一个索引开始。确保您在(user, amount)上有索引。这肯定会对第一个查询有所帮助。

至于第二种,它将具有挑战性。此查询需要遍历所有数据,因此加快速度的选项是使用更快的硬件。

在您的情况下,您最好的选择是拥有一张包含当前余额的表格,并使用触发器维护此表格。

答案 1 :(得分:0)

最好有两个表 - 一个包含所有交易(如您所述)和一个在每天结束时有余额的表。

与第二个表略有不同的方法是每天进行更改。它会有dayuserchange。此表格中的总和将为您提供当前的余额'更快。

我假设有很多交易'每位用户每天。如果不是这种情况,您可能希望按周或其他较不频繁的时间段进行汇总。

你需要创建和维护这个"汇总表",因为MySQL没有"物化视图"。 Here讨论了如何有效地使用大型数据仓库应用程序的汇总表。