2013-01-03 44 views
1

让我举一个我的问题的例子。假设我有一个名为的用户和一个名为付款的表。要计算用户的总余额,我会使用查询来获取特定日期后的所有付款,然后将结果缓存一段时间。缓存大型SQL查询 - 构建的最佳方式?

但是,我想知道,由于这种性质,在用户表中有一个名为balance的列,然后当缓存过期时,我使用不同的查询来收集付款,但是从较短的时间,然后将这个数量加到balance列中的任何内容上?

+0

“*它会是一个好主意*” - 取决于您的应用程序。你多久更新一次余额?您需要多久取一次?你使用什么不同的查询来完成后者(MySQL会自动缓存查询结果,只要发出相同的查询,这是非常有用的)? – eggyal

+0

每次付款时都会更新余额,但用户的更改可能会延迟(缓存几分钟或某事)。查询本身会根据每个用户而改变,并且结果会非常频繁地改变(基于付款次数)。以及另一个因素;支付时间。 – Prash

+0

我通常有列'something_cache'和函数来完全重新生成它们。我不认为一个函数能够正确地重新生成它们*只有大部分时间*不是很好。但正如eggyal所说,这实际上取决于您的应用程序。 – AndreKR

回答

2
这些类型的“预先计算”的价值观我觉得最痛苦中解脱的方式是存储/更新他们保存的是涉及数据

总之

因此,任何模型,更新总余额

一般每当新的付款被保存。这样,你能保证你的数据库和你的数据将始终保持同步

预先计算可以是一个MySQL触发器或类似的Gearman


但是作为你自己的问题后台任务建议如果你想做一些增加的余额汇总,我会建议去几个月或某个固定的日期范围。如果付款可能在过去的一个月出现,那么这将起作用,因为您没有支付回款或类似的东西。

开始新月份,运行支付聚合器,bam,您现在只需要对每月表格进行求和。

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

+0

是的 - 你的最后一点,这就是为什么我有一个静态的“平衡”列犹豫不决。 – Prash

+0

您是否期望太多的数据在查询中聚合? (说更新,甚至后台任务?) –

+0

没有太多的数据。你会考虑哪些数据太多? – Prash

3

要计算用户的总余额,

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

如果您需要更加区分的用户关系,可以在用户关系旁边保留一个日期列,以表示您需要进行计算的时间间隔。例如。过去一周的回复数字或月份数字。

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

然后,您可以将尚未压缩/压缩日期的“实时”付款表与UNION结合起来。然后使用聚合函数来总和总余额。如果您需要保留最近的数据以获得更详细的信息,您可以在一段时间后离开数据存储区,只保留统计值,这可能会为您提供两全其美的解决方案。

+0

我看到。因此,不是每次都要计算余额,我只能从余额栏中读取余额。这有效,但如果你理解我的意思,它对我来说似乎并不是很“动态”。 – Prash

+0

@Prash:不,但我扩展了两个分支的答案,你可以从这个基本思想中进入,这两个分支都增加了更多的动态性。 – hakre

+0

顺便说一句,是第一个想要说列或表? – Prash