我该如何优化此功能?我需要循环用户,然后遍历用户提交的数据,并更新值,它采取> 1分钟

时间:2014-06-17 14:58:37

标签: php mysql pdo

如何优化此功能?我需要循环用户,然后遍历用户提交的数据,并更新值,它采取> 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是所有列的索引。

我不是在寻找代码答案,我宁愿只是朝着正确的方向努力。

感谢。

1 个答案:

答案 0 :(得分:1)

$sql = "SELECT user_id FROM users";可以将$ug_sql查询加入到一个查询中。

如果你使用InnoDB表,你可以在事务中进行更新,它会加快它。

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