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

Php 缓存大型SQL查询-结构化的最佳方式?,php,mysql,caching,optimization,Php,Mysql,Caching,Optimization,让我举一个我的问题的例子。假设我有一个名为users的表和一个名为payments的表。为了计算用户的总余额,我会使用一个查询来获取某个日期之后的所有付款,然后将结果缓存一段时间 但是,我想知道,由于这种性质,在users表中有一个名为balance的列,然后在缓存过期时,我使用不同的查询收集付款,但时间较短,然后将此金额添加到余额列中的任何内容?通常,使用这些类型的预计算值,我发现最省力的方法是在保存与数据相关的任何模型时存储/更新它们 因此,简而言之,每当保存新付款时,更新总余额。这样,您可

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


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

通常,使用这些类型的预计算值,我发现最省力的方法是在保存与数据相关的任何模型时存储/更新它们

因此,简而言之,每当保存新付款时,更新总余额。这样,您可以保证数据库和数据始终保持同步

预计算可以是mysql触发器,也可以是具有Gearman之类功能的后台任务

但正如你自己的问题所建议的,如果你想对余额进行某种增量汇总,我建议按月份或某个固定日期范围进行。如果你没有付款回溯或类似的东西,付款可能会出现在一个旧的月份,这将起作用

在新的一个月开始时,运行一个支付聚合器bam,您现在只需要对每月的表求和


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

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

因此,简而言之,每当保存新付款时,更新总余额。这样,您可以保证数据库和数据始终保持同步

预计算可以是mysql触发器,也可以是具有Gearman之类功能的后台任务

但正如你自己的问题所建议的,如果你想对余额进行某种增量汇总,我建议按月份或某个固定日期范围进行。如果你没有付款回溯或类似的东西,付款可能会出现在一个旧的月份,这将起作用

在新的一个月开始时,运行一个支付聚合器bam,您现在只需要对每月的表求和

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

要计算用户的总余额

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

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

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

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

要计算用户的总余额

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

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

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

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

这是一个好主意吗?取决于您的应用程序。您多久更新一次余额?你需要多久取一次?您使用什么不同的查询来执行后一个MySQ

L自动缓存查询结果,只要发出相同的查询,这是有用的?余额将在每次支付款项时更新,但是对用户的更改可能会延迟缓存几分钟或其他时间。查询本身将根据每个用户进行更改,结果将根据付款数量频繁更改。还有一个因素,;付款时间。我通常有一些列和缓存,以及完全重新生成这些列的函数。我认为只有在大多数情况下才能正确地重新生成它们的函数是不好的。但正如eggyal所说,这实际上取决于您的应用程序。您可以更新users表上的balance列并使用触发器进行更新。您真的有问题吗?你的查询速度慢吗?听起来您好像在猜测您有性能问题,但没有度量值。任何没有测量的优化都是不成熟的。这是一个好主意吗?取决于您的应用程序。您多久更新一次余额?你需要多久取一次?您使用哪些不同的查询来执行后一种MySQL自动缓存查询结果,只要发出相同的查询,这是有用的?余额将在每次付款时更新,但是对用户的更改可能会延迟缓存几分钟或其他时间。查询本身将根据每个用户进行更改,结果将根据付款数量频繁更改。还有一个因素,;付款时间。我通常有一些列和缓存,以及完全重新生成这些列的函数。我认为只有在大多数情况下才能正确地重新生成它们的函数是不好的。但正如eggyal所说,这实际上取决于您的应用程序。您可以更新users表上的balance列并使用触发器进行更新。您真的有问题吗?你的查询速度慢吗?听起来您好像在猜测您有性能问题,但没有度量值。我明白了,任何没有测量的优化都是不成熟的。因此,我不必每次都计算余额,而只需从余额栏中读取。这是可行的,但对我来说似乎不是很有活力,如果你明白我的意思的话?@Prash:不,但我扩展了两个分支的答案,你可以从这两个基本概念开始,它们都增加了活力。顺便说一句,这是第一个“喜欢说”专栏,还是表?它自己的一个表,有一列表示用户ID,一列表示总计以存储聚合值。这基本上类似于map reduce。每次更新主表时只需映射/减少。我可以问一下为什么吗?而不是在用户表中为其总数设置一列:我懂了。因此,我不必每次都计算余额,而只需从余额栏中读取。这是可行的,但对我来说似乎不是很有活力,如果你明白我的意思的话?@Prash:不,但我扩展了两个分支的答案,你可以从这两个基本概念开始,它们都增加了活力。顺便说一句,这是第一个“喜欢说”专栏,还是表?它自己的一个表,有一列表示用户ID,一列表示总计以存储聚合值。这基本上类似于map reduce。每次更新主表时只需映射/减少。我可以问一下为什么吗?而不是在用户表中为其总数设置一列:是的-你的最后一点,这就是为什么我对创建静态平衡列有点犹豫的原因。你是否期望在查询中聚合太多的数据?比如说更新,甚至是后台任务?没有太多数据。你会考虑太多的数据吗?@数量与你拥有的服务器功率有关。如果对整个数据集进行2年左右的计算的查询所需时间不到一秒钟,则可以将其作为触发器。如果你的服务器比你预期的慢,也许你应该聚合Eyeah-你的最后一点,这就是为什么我对创建静态平衡列有点犹豫的原因。你是否期望在查询中聚合太多的数据?比如说更新,甚至是后台任务?没有太多数据。你会考虑太多的数据吗?@数量与你拥有的服务器功率有关。如果对整个数据集进行2年左右的计算的查询所需时间不到一秒钟,则可以将其作为触发器。如果您的服务器比您预期的慢,也许您应该聚合