私はこれまでに、名前、ID、スコア、およびランクを含む 7000 行以上のリーダーボード データを持つプロジェクトに取り組んでいます。それは継続的に拡大しており、私は現在、誰かが新しいスコアを投稿するたびにすべてを更新しようとした後、サーバーがタイムアウトするという障害に遭遇しました.
現在、ループした execute() 呼び出しと組み合わせたクエリで PDO を使用しています。これを行うための大幅に高速な方法はありますか (おそらく単一の 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());
}