php - 为超过 350,000 名用户计算 "ranks"的有效方法

标签 php mysql performance for-loop

<分区>

Possible Duplicate:
Mysql rank function

我正在制作一个排名网站,每个用户都会有一个基于级别的独特排名。 #1 是最好的排名,因为有 350,000 个用户,最差的排名将是 #350000。

任何用户都不能拥有与其他任何人相同的排名。现在,当添加新用户时,会计算他们的级别。计算完成后,脚本将“重建”排名,逐一检查每个用户,并计算他们的新排名。

这里是查询的解释:

  • "Id"为成员(member)在数据库中的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 名用户,这往往会运行得很慢。本质上,在数据库中,Rank(“ORDER BY `Rank` DESC”)是它们的级别,因此查询将对它们进行排序。不幸的是,其余的过程很慢。

以这种方式处理所有 350,000 个用户大约需要 97 秒。是否有任何可能的解决方案来更高效、更快速地运行它?

最佳答案

您为新用户计算 NewNum,然后递增所有数字

 UPDATE Members SET Rank = Rank+1  WHERE Rank > NewNum

编辑 将 RankNum 更改为 Rank。我在您修改后查看了问题

关于php - 为超过 350,000 名用户计算 "ranks"的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992793/

相关文章:

php - 登录在桌面上有效,但在移动设备上无效?

php - 在匿名函数中调用匿名函数(Inception)

mysql - 如何使内部连接高效的mysql

java - 使用 Pattern/Matcher 是否比循环遍历字符串并查找字符更有效?

javascript - Angular - 嵌套 $scope 会产生嵌套 $watchers?

php - 日期未插入 mysql

php - flock() 在 Linux 上可靠吗?

php - mysql ,删除后,最后插入的行正好位于已删除行的位置

mysql - 数据库中的日期条目

Python 3.6 连接 MySQL