在PHP

时间:2015-08-01 17:26:49

标签: php mysql caching statistics

我如何处理PHP中的用户统计信息?

我可以选择两种明显的方法。两者都有缺陷。

  • 必要时选择MySQL COUNT。这里的缺陷是,如果你要计算很多行,那么它可能会很慢,特别是当你必须在看似每个页面加载时这样做。好处是计数总是正确的。

  • 将用户统计信息存储在统计信息表中。这里的缺陷是,无论何时进行更改,您都必须不断更新它,如果您需要批量更新,这会使代码过于复杂。好处是,为用户选择单行统计数据的速度很快,而不是执行计数。

另一种可能的方法我有点" eh"关于将作业存储在队列中(并让Laravel处理它)。这些作业将使用其他表更新必要的统计信息,以便正确同步。其好处是它可以减轻Web服务器的负担,并且缺陷是用户可能会得到不正确的统计信息。 你的自己的朋友列表不希望当实际数字变化很大时,例如有15个朋友和7个朋友请求。

我已经详细介绍了我提出的方法,并且我不确定在为用户提供正确结果以及平衡速度和简单性方面最好的方法。如果我正在执行COUNT方法,那么如果要更新统计信息,我可能会缓存结果并删除缓存记录但我想象在EACH用户的缓存表中存储一行有点过度杀伤力。也许这不是一个真正的问题,只要数据库有足够的空间,但无论如何,通过大量缓存表进行搜索肯定会很慢?

也许有人可以给我最好的选择来处理用户统计信息。我的头脑在旋转,因为它过度思考所有事情,我需要穿上直线和狭窄。

提前致谢。

1 个答案:

答案 0 :(得分:4)

在规划应用的这一部分时,请不要夸大COUNT(*)的费用。如果表上有正确的索引,行计数非常快。事实上,如果你的表是MyISAM,它的复杂度可能是O(1)。

例如,如果您在user上有索引,则查询SELECT COUNT(*) AS num FROM friend WHERE user = 'mickey@disney.com'将非常快。

轻松构建您的应用。当你拥有一万个用户时,你可以重新设计这种统计计算,使其更加精细和高效。当您拥有更多用户时,如果您提供近似结果,则不会那么明显。

但是,要小心。在大多数情况下,COUNT(*)比COUNT(表达式)快得多。 *允许MySQL避免评估每一行。