繁体   English   中英

如何优化此功能? 我需要遍历用户,然后遍历用户提交的数据并更新值,这需要1分钟以上的时间

[英]How can I optimize this function? I need to loop though users, and then loop through user submitted data, and update values, it's taking > 1 minute

如何优化此功能? 我需要遍历用户,然后遍历用户提交的数据并更新值,对于264位用户而言,这花费了超过1分钟的时间,每位用户大约有80条记录。

public function calculateUserPoints(){
    set_time_limit(0);
    /* Select users */
    $sql = "SELECT user_id FROM users";
    $query = $this->db->prepare($sql);
    $query->execute();
    $users = $query->fetchAll(PDO::FETCH_ASSOC);


    /* User guesses Query */

    $ug_sql = "SELECT 
                guesses.guess_id AS r_guess_id, guesses.user_id, guesses.game_id, guesses.team_1_score AS guess_team_1, guesses.team_2_score AS guess_team_2, guesses.joker,
                games.game_id, games.game_team_1, games.game_team_2, games.real_score_team_1, games.real_score_team_2,
                users.user_id AS usr_id
                FROM games
                JOIN users 
                    ON users.user_id = :user_id AND games.real_score_team_1 IS NOT NULL AND games.real_score_team_2 IS NOT NULL
                LEFT JOIN guesses 
                    ON guesses.user_id = users.user_id
                    AND guesses.game_id = games.game_id 
                    ";
    $ug_query = $this->db->prepare($ug_sql);
    foreach($users as $u){ /* Loop users */
        /* Get guesses per user basis */
        /*echo 'User '.$u['user_id'].'<br/>';*/
        $ug_query->bindParam(':user_id', $u['user_id']);
        $ug_query->execute();
        $usr_guesses = $ug_query->fetchAll(PDO::FETCH_ASSOC);
        $u_points = 0;
        $sql = "UPDATE users SET points = :u_points WHERE user_id = :usr_id";
        $query = $this->db->prepare($sql);
        $sql2 = "UPDATE guesses SET guess_points = :guess_points WHERE guesses.guess_id = :guess_id";
        $query2 = $this->db->prepare($sql2);
        foreach($usr_guesses AS $ug){
            $err = false;
            $g_points = 0;
            if(isset($ug['guess_team_1']) && isset($ug['guess_team_1'])){
                $g_points = $this->calcPoints($ug['guess_team_1'], $ug['guess_team_2'], $ug['real_score_team_1'], $ug['real_score_team_2'], $ug['joker']);
            } else {
                $u_points -= 1;
            }
            $u_points += $g_points;
            /*  echo $ug['guess_team_1'].' - '.$ug['guess_team_2'].'  :: '.' '.$ug['real_score_team_1'].' - '.$ug['real_score_team_2'].' jk: '.$ug['joker'].' / pt: '.$g_points.':: T: '.$u_points.'<br/>';*/   

            $query->bindParam(':u_points', $u_points);
            $query->bindParam(':usr_id', $u['user_id']);    
            $query2->bindParam(':guess_points', $g_points);
            $query2->bindParam(':guess_id', $ug['r_guess_id']);             
            if($query->execute() && $query2->execute()){
                $err = false;
            } else {
                $err = true;
            }       
        }   
    }
    if($err == true){
        return false;
    } else {
        return true;
    }   

}

guess_id和user_id是所有列的索引。

我不是在寻找代码答案,我只希望朝着正确的方向前进。

谢谢。

$sql = "SELECT user_id FROM users"; 可以与$ug_sql查询合并为一个查询。

如果使用InnoDB表,则可以在事务中进行更新,这将加快更新速度。

考虑删除一些索引,它们会减慢插入,更新和删除的速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM