使用许多foreach循环计算用户点的有效方法是什么?

时间:2015-07-10 15:47:47

标签: php mysql zend-framework

我需要根据他们发布的文章的某些因素来计算用户的观点。这是一个每小时运行一次的cron工作。

目前,我就是这样做的:

  1. 获取已发布至少1篇文章的用户列表(以缩小列表范围)
  2. 对于每个用户,从数据库(foreach循环)中选择他/她的文章并进行计算。然后将他/她的观点更新为数据库。
  3. 基本上,就像:

    $userList = getList();
    
    foreach ($userList as $user)
    {
        $articleList = getArticles($user);
        $point = 0;
        foreach ($articleList as $article)
        {
            // Do calculation here
        }
        updateUserPoint($point);
    }
    

    这可以正常工作。但是,当你来到大型数据库(> 10k用户和> 100k文章)时,这个脚本运行得越来越慢,因为列表越来越长,这些循环需要更长的时间。 MySQL查询的数量也在迅速增加。

    请帮我一个好方法。我认为我的效率不够好。

    非常感谢。

1 个答案:

答案 0 :(得分:0)

需要在getArticles函数中更改代码,查询应该使用sum和group by user_id一起获取该特定用户的点总和,然后需要在函数updateUserPoint函数中使用该用户id更新点。

如果你提供getArticals函数完成,我会改变它以获得该特定用户的积分总和,然后你可以用它来更新。