php - 在不杀死服务器的情况下更新用户排名的最佳方式

标签 php mysql optimization query-optimization ranking

我有一个以用户排名为核心部分的网站,但用户数量已增长到 50,000 多个,这给服务器带来了压力,要循环遍历所有这些网站以每 5 分钟更新一次排名。是否有更好的方法可以至少每 5 分钟轻松更新一次排名?它不必与 php 一起使用,它可以像 perl 脚本一样运行,或者类似的东西可以更好地完成工作(尽管我不确定为什么会这样,只是离开我的选项在这里打开)。

这是我目前更新排名的方法:

$get_users = mysql_query("SELECT id FROM users WHERE status = '1' ORDER BY month_score DESC");
$i=0;
while ($a = mysql_fetch_array($get_users)) {
    $i++;
    mysql_query("UPDATE users SET month_rank = '$i' WHERE id = '$a[id]'");
}

更新(解决方案):

这是解决方案代码,执行和更新所有 50,000 行所需的时间不到 1/2 秒(按照 Tom Haigh 的建议将排名作为主键)。

mysql_query("TRUNCATE TABLE userRanks");
mysql_query("INSERT INTO userRanks (userid) SELECT id FROM users WHERE status = '1' ORDER BY month_score DESC");
mysql_query("UPDATE users, userRanks SET users.month_rank = userRanks.rank WHERE users.id = userRanks.id");

最佳答案

使 userRanks.rank 成为自动递增的主键。如果您随后按降序将 userids 插入到 userRanks 中,它将增加每一行的 rank 列。这应该非常快。

TRUNCATE TABLE userRanks;
INSERT INTO userRanks (userid) SELECT id FROM users WHERE status = '1' ORDER BY month_score DESC;
UPDATE users, userRanks SET users.month_rank = userRanks.rank WHERE users.id = userRanks.id;

关于php - 在不杀死服务器的情况下更新用户排名的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/948832/

相关文章:

php - mysql_connect() : Access denied for user 'root'

mysql - 有没有其他方法可以写这个查询

optimization - 渲染优化

php - MySQL - 有没有办法将表数据与给定字符串匹配,而不是反之亦然

php - 在 Laravel 中扩展一个页面来扩展另一个页面

php - 使用php和mysql的多关键字搜索表单

php - 共享主机有哪些第三方搜索引擎软件/库

php - 如何避免在 MySQL 请求中连接表

php - SQLSTATE[HY000] : General error: 1210 Incorrect arguments to mysqld_stmt_execute

mysql - 优化此 SQL 查询