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