重複の可能性:
Mysql ランク関数
私はランクのウェブサイトを作っており、各ユーザーはレベルに基づいて独自のランクを持っています. 1 位が最高ランクで、ユーザー数が 350,000 であるため、最低ランクは 350,000 位になります。
ユーザーが他のユーザーと同じランクを持つことはできません。現在、新しいユーザーが追加されると、そのレベルが計算されます。計算後、スクリプトは各ユーザーを 1 人ずつ調べて新しいランクを計算することにより、ランクを「再構築」します。
クエリの説明は次のとおりです。
- 「Id」は、データベース内のメンバーの ID です。
- 「RankNum」はレベルです。名前を変更する必要があります。
- 「ランク」は、1 位から 350000 位までの固有のランクです。
これが私の現在のスクリプトです:
function RebuildRanks() {
$qD = mysql_query("SELECT `Id`,`RankNum` FROM `Members` ORDER BY `Rank` DESC, `Id` ASC");
$rowsD = mysql_num_rows($qD);
$curRank = 0;
for($x = 1; $x <= $rowsD; $x++) {
$rowD = mysql_fetch_array($qD);
$curRank++;
if($rowD['RankNum'] != $curRank) {
if($curRank != 0) {
mysql_query("UPDATE `Members` SET `RankNum`='$curRank' WHERE `Id`='".$rowD['Id']."'");
}
}
}
return true;
}
ユーザー数が 350,000 の場合、これは非常に遅くなる傾向があります。基本的に、データベースではランク("ORDER BY `Rank` DESC") がレベルであるため、クエリはそれらを並べ替えます。残念ながら、残りのプロセスは遅いです。
この方法で 350,000 人のユーザーすべてを処理するには、約 97 秒かかります。これをより効率的かつ迅速に実行するための解決策はありますか?