我正在做一个项目,到目前为止已经有7000多行的排行榜数据,其中包括姓名,身份证,分数和排名。它在不断地扩展,我现在遇到了一个障碍,每次有人发布新的分数时,服务器都会在尝试更新所有内容后超时。
目前,我正在使用PDO和一个结合了循环execute()调用的查询。有没有一种更快的方法(可能是在一个mySQL查询中)?或者,你对如何处理更新排行榜有什么建议吗?

    $stmt = $dbh->prepare("SELECT * FROM high_scores ORDER BY score DESC");
    $stmt->execute();

    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $results = $stmt->fetchAll();

    //

    $numItems = count($results);

    // is this OK or a no-no?

    try {

        $stmt = $dbh->prepare("UPDATE high_scores SET rank = :rank WHERE uid = :uid");

        for($i=0; $i<$numItems; $i++){
            $rank = $i + 1;
            $uid = $results[$i]['uid'];
            $stmt->execute(array(':rank' => $rank, ':uid' => $uid));
        }

        return true;

    } catch (PDOException $e) {
        echo($e->getMessage());
    }

最佳答案

你为什么要储存军衔?这是一个非规范化的形式,你真的需要它吗?或者你实现了那个步骤,因为它本来是需要的?
例如,请参见此解决方案:
http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/
也许试试这个表演吧?
另外,如果您看到他制作的示例,您可以在查询中使用变量。这也将允许此update语句将其合并到单个查询中。循环中的查询是一个困难的查询,不幸的是,它甚至很难真正有效。

关于php - 用MySQL更新1000行的最有效方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11304419/

10-11 03:40
查看更多