缓存大型SQL查询 - 最佳结构化方法?

时间:2013-01-03 19:20:31

标签: php mysql caching optimization

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

但是,我想知道,由于其性质,在用户表中有一个名为balance的列是一个好主意,然后当缓存过期时,我会使用不同的查询来收集付款但是从较短的时间开始,然后将此金额添加到balance列中的任何内容?

2 个答案:

答案 0 :(得分:3)

  

计算用户的总余额

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

如果您需要更加差异化,可以在用户关系旁边,保留一个日期列,表示您需要能够进行计算的时间间隔。例如。能够在过去提供回顾的周数或月号。

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

然后,您可以使用对于尚未压缩/压缩的日期“实时”的付款表来UNION它。然后使用聚合函数来计算总余额。如果您需要保留最近的数据,并且可以在一段时间后移出数据存储,只需保留统计值,这可能会为您提供两全其美的优势。

答案 1 :(得分:2)

通常使用这些“预先计算”的值,我发现最无痛的方法是在保存任何涉及数据的模型时存储/更新它们

简而言之,只要保存新付款,就会更新总余额。这样您就可以保证数据库和数据始终保持同步

预计算可以是mysql触发器,也可以是像Gearman

这样的后台任务

但正如你自己的问题所暗示的那样,如果你想对余额进行某种增量汇总,我会建议按月或某些固定日期范围进行。如果您没有付款回溯或类似的东西,这可能会有效,其中付款可能会在旧月出现。

新月开始,运行付款聚合器,bam,您现在只需将月度表总结。

这一切都取决于您需要处理多少数据。但我再次强调,数据一致性比速度更有价值,你可以随时购买更多的服务器。