假设我有一张表,其中包含数百万条记录银行账户交易的记录。 (这不是银行账户,但对于这个问题而言足够接近。)
我可以运行这些SELECT命令来获取任何特定用户或所有用户的“余额”......
SELECT SUM(amount) AS balance FROM MyTable where user = (id)
SELECT user, SUM(amount) AS balance FROM MyTable GROUP BY user
这样做的问题是,添加更多记录需要更长时间,而且表格会增长。
我怀疑(恐惧?)答案是添加一个更新第二个每用户表的触发器。但是,我想知道,这种模式对于银行业务或会计系统是否足够普遍,以至于数据库系统具有为此用途而设计的内置优化?
答案 0 :(得分:0)
首先,我将从一个索引开始。确保您在(user, amount)
上有索引。这肯定会对第一个查询有所帮助。
至于第二种,它将具有挑战性。此查询需要遍历所有数据,因此加快速度的选项是使用更快的硬件。
在您的情况下,您最好的选择是拥有一张包含当前余额的表格,并使用触发器维护此表格。
答案 1 :(得分:0)
最好有两个表 - 一个包含所有交易(如您所述)和一个在每天结束时有余额的表。
与第二个表略有不同的方法是每天进行更改。它会有day
,user
和change
。此表格中的总和将为您提供当前的余额'更快。
我假设有很多交易'每位用户每天。如果不是这种情况,您可能希望按周或其他较不频繁的时间段进行汇总。
你需要创建和维护这个"汇总表",因为MySQL没有"物化视图"。 Here讨论了如何有效地使用大型数据仓库应用程序的汇总表。