如何在PHP中处理用户统计数据最佳方法

4
我该如何在PHP中处理用户统计数据?
有两种明显的方法可供选择,但它们都有自己的缺点。
1. 在必要时使用MySQL COUNTs进行选择。这里的缺点是如果你需要计算很多行,那么速度可能会很慢,特别是当你似乎需要在每个页面加载时都这样做时。好处是计数总是正确的。
2. 将用户统计数据存储在统计表中。这里的缺点是每次更改时都必须持续更新它,如果需要批量更新,代码就会过于复杂。好处是选择单个用户的一行统计数据将更快,而不是执行计数。
还有一种可能的方法我有些犹豫,那就是将一个作业存储在队列中(并让Laravel处理它)。这些作业将使用其他表更新所需的统计信息,以便正确同步。好处是它可以减轻Web服务器的负担,缺点是用户可能会得到不正确的统计信息。如果你的朋友列表上显示的实际数字与15个朋友和7个朋友请求不符,那么这是不可取的。
我详细介绍了我提出的方法,并且不确定在为用户提供正确结果、平衡速度和简单性方面哪种最好。如果我使用COUNT方法,那么可能我可以缓存结果,并在统计数据需要更新时删除缓存记录,但是我想为每个用户在缓存表中存储一行可能有点过头了。也许这不是真正的问题,只要数据库有足够的空间就可以了,但是肯定会慢搜索巨大的缓存表。
也许有人可以给我最好的选择来处理用户统计数据。我的头脑已经转得晕了,我需要被放在正确的道路上。
提前感谢你的帮助。
1个回答

4
不要夸大计划应用程序中COUNT(*)的成本。如果您在表上有正确的索引,则行计数非常快。实际上,如果您的表是MyISAM,则其复杂度可以为O(1)。
例如,如果您在user上拥有索引,则查询SELECT COUNT(*) AS num FROM friend WHERE user = 'mickey@disney.com'将非常快。
以简单的方式构建您的应用程序。当您有一万个用户时,可以重新设计此类统计计算,使其更加复杂和高效。当您拥有更多用户时,如果呈现近似结果,则不会像之前那样明显。
但要小心。在大多数情况下,COUNT(*)比COUNT(expression)快得多。*允许MySQL避免评估每一行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接