让我举一个我的问题的例子。假设我有一个名为的用户和一个名为付款的表。要计算用户的总余额,我会使用查询来获取特定日期后的所有付款,然后将结果缓存一段时间。缓存大型SQL查询 - 构建的最佳方式?
但是,我想知道,由于这种性质,在用户表中有一个名为balance
的列,然后当缓存过期时,我使用不同的查询来收集付款,但是从较短的时间,然后将这个数量加到balance
列中的任何内容上?
让我举一个我的问题的例子。假设我有一个名为的用户和一个名为付款的表。要计算用户的总余额,我会使用查询来获取特定日期后的所有付款,然后将结果缓存一段时间。缓存大型SQL查询 - 构建的最佳方式?
但是,我想知道,由于这种性质,在用户表中有一个名为balance
的列,然后当缓存过期时,我使用不同的查询来收集付款,但是从较短的时间,然后将这个数量加到balance
列中的任何内容上?
因此,任何模型,更新总余额
一般每当新的付款被保存。这样,你能保证你的数据库和你的数据将始终保持同步
预先计算可以是一个MySQL触发器或类似的Gearman
但是作为你自己的问题后台任务建议如果你想做一些增加的余额汇总,我会建议去几个月或某个固定的日期范围。如果付款可能在过去的一个月出现,那么这将起作用,因为您没有支付回款或类似的东西。
开始新月份,运行支付聚合器,bam,您现在只需要对每月表格进行求和。
这一切都取决于你需要处理多少数据。但是我再次强调,数据一致性比速度更有价值,你可以随时购买更多的服务器。
要计算用户的总余额,
您可以创建总是包含用户当前余额的附加表。如果为用户添加了新的付款,则该列也需要更新。进行交易,以便添加付款并更新总余额。
如果您需要更加区分的用户关系,可以在用户关系旁边保留一个日期列,以表示您需要进行计算的时间间隔。例如。过去一周的回复数字或月份数字。
如果您需要更多的灵活性,您可以在一段时间后将现有付款压缩到总价值中,并将其存储到与用户相关并保留日期列的此类余额表中。
然后,您可以将尚未压缩/压缩日期的“实时”付款表与UNION结合起来。然后使用聚合函数来总和总余额。如果您需要保留最近的数据以获得更详细的信息,您可以在一段时间后离开数据存储区,只保留统计值,这可能会为您提供两全其美的解决方案。
“*它会是一个好主意*” - 取决于您的应用程序。你多久更新一次余额?您需要多久取一次?你使用什么不同的查询来完成后者(MySQL会自动缓存查询结果,只要发出相同的查询,这是非常有用的)? – eggyal
每次付款时都会更新余额,但用户的更改可能会延迟(缓存几分钟或某事)。查询本身会根据每个用户而改变,并且结果会非常频繁地改变(基于付款次数)。以及另一个因素;支付时间。 – Prash
我通常有列'something_cache'和函数来完全重新生成它们。我不认为一个函数能够正确地重新生成它们*只有大部分时间*不是很好。但正如eggyal所说,这实际上取决于您的应用程序。 – AndreKR