缓存大型SQL查询-最佳的结构化方式


Caching a large SQL query - best way of structuring?

让我举一个例子来说明我的问题。假设我有一个名为users的表和一个名为payments的表。为了计算用户的总余额,我将使用查询来获取特定日期之后的所有付款,然后将结果缓存一段时间。

然而,我想知道,由于这种性质,在用户表中有一列称为balance,然后当缓存到期时,我使用不同的查询来收集付款,但从较短的时间,然后将此金额添加到balance列中的任何东西,这是一个好主意吗?

要计算用户的总余额,

您可以创建一个附加表,该表始终包含用户的当前余额。如果为用户添加了新的付款,则该列也需要更新。执行一个交易,使添加付款和更新总余额保持一致。

如果您需要这更有区别,您可以在用户关系旁边,保留一个日期列,表示您需要能够进行计算的间隔。例如,星期数或月数,以便能够回顾过去。

如果您需要更大的灵活性,您可以在一段时间后将现有付款压缩为总价值,并将其存储在与用户相关并保留日期列的余额表中。

然后,您可以将它与尚未压缩/浓缩的日期的"实时"付款表合并。然后使用聚合函数对总余额求和。如果需要保存更详细的最新数据,可以在一段时间后移出数据存储,只保留统计值,这可能会使您两全美美。

一般来说,对于这些"预先计算"的值,我发现最省事的方法是在保存与数据有关的任何模型时存储/更新它们

所以简而言之,每当保存新的付款时更新总余额。这样你就可以保证你的数据库和你的数据总是同步的

预计算可以是mysql触发器,也可以是类似Gearman的后台任务


但正如你自己的问题所建议的,如果你想对余额进行某种增量累积,我建议按月或固定日期范围进行。如果你没有付款回溯或类似的东西,这将是有效的,因为付款可能出现在前一个月。

新的一个月开始,运行一个支付聚合器,砰,你现在只需要合计每月的表格。

这完全取决于你要处理多少数据。但我再次强调,数据一致性比速度更有价值,你总是可以购买更多的服务器。