我需要根据用户发布的文章的一些因素来计算用户的积分。这是一个每小时运行一次的 cron 作业。
目前,我是这样做的:
- 获取至少发布了 1 篇文章的用户列表(以缩小列表范围)
- 对于每个用户,从数据库中选择他/她的文章(foreach 循环)并进行计算。然后将他/她的点更新到数据库。
基本上,就像:
$userList = getList();
foreach ($userList as $user)
{
$articleList = getArticles($user);
$point = 0;
foreach ($articleList as $article)
{
// Do calculation here
}
updateUserPoint($point);
}
这可以正常工作。但是,当您遇到大型数据库(> 10k 用户和 > 100k 文章)时,此脚本运行速度越来越慢,因为列表越来越长并且这些循环需要更长的时间。 MySQL查询的数量也迅速增加。
请帮我一个好方法来做到这一点。我认为我的效率不够高,也不够好。
非常感谢。
最佳答案
需要更改 getArticles 函数中的代码,并且查询应同时使用 sum 和 group by user_id 来获取该特定用户的积分总和,然后需要在函数 updateUserPoint 函数中使用该用户 ID 更新积分。
如果您向我提供完整的 getArticals 函数,我将更改它以获取该特定用户的积分总和,然后您可以使用它来更新。
关于php - 通过多次 foreach 循环计算用户积分的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31345070/