Mysql 使用选择更新以创建排名(效率)

Mysql 使用选择更新以创建排名(效率),mysql,sql,performance,sqlperformance,Mysql,Sql,Performance,Sqlperformance,我有一个排名,每X时间有一个平衡添加到每个球员的总分,改变他们的排名方式。 我希望我的排名是在DB MySQL上计算的,但我希望它是高效的,所以首先,这里是平衡代码: 问题1: 一旦所有玩家的积分都更新了,我只想为排名靠前的玩家重新排序,如下所示: 问题2: 它工作了,解决了我的问题,但是:这是让1选择,并从这里更新所有值,还是让它为每个playerscore行进行选择 在伪代码中,这是我不想要的: 正如它将是,对于N个玩家:N选择+N更新。 我希望它是:1选择包含在单个更新中的+N个更新,如下

我有一个排名,每X时间有一个平衡添加到每个球员的总分,改变他们的排名方式。 我希望我的排名是在DB MySQL上计算的,但我希望它是高效的,所以首先,这里是平衡代码:

问题1:

一旦所有玩家的积分都更新了,我只想为排名靠前的玩家重新排序,如下所示:

问题2:

它工作了,解决了我的问题,但是:这是让1选择,并从这里更新所有值,还是让它为每个playerscore行进行选择

在伪代码中,这是我不想要的:

正如它将是,对于N个玩家:N选择+N更新。 我希望它是:1选择包含在单个更新中的+N个更新,如下所示:

new = get_all_players_sorted
foreach PlayerScore p in playescore
    update p.rank = new.new_rank where p.player_id = new.player_id
endforeach

我的查询Q2是否正确???

如果这是您的查询,您可能可以通过重新表述查询并使用索引来加快查询速度

您想要的索引是playerscoreis_ranked,points desc。查询为:

SET @r = 0;

UPDATE playerscore p
    SET p.rank = (@r := @r + 1)
    WHERE is_ranked = 1
    ORDER BY points desc;

在MySQL中,只要不使用连接,就可以使用orderby和update。在这种情况下,您不需要连接,因为您正在将变量设置为一个单独的语句。

工作起来非常好,速度非常快!使用100k寄存器进行测试,不到一秒钟就完成了Q1+Q2:
foreach PlayerScore p in playescore
    new = get_all_players_sorted
    update p.rank = new.new_rank where p.player_id = new.player_id
endforeach
new = get_all_players_sorted
foreach PlayerScore p in playescore
    update p.rank = new.new_rank where p.player_id = new.player_id
endforeach
SET @r = 0;

UPDATE playerscore p
    SET p.rank = (@r := @r + 1)
    WHERE is_ranked = 1
    ORDER BY points desc;