我在此查询中的表现非常差,以获得每个排行榜的玩家排名。它随着条目数量的增长呈指数级增长(如预期的那样)。 有没有办法优化这个?我认为我可以在每次更新时计算这个字段作为替代:
SELECT `s1`.*,COUNT(DISTINCT `s2`.`score`) AS `rank` FROM `leaderboards` `s1`
JOIN `leaderboards` `s2`
ON(`s1`.`score` <= `s2`.`score` AND `s1`.`leaderboard` = `s2`.`leaderboard`)
GROUP BY `s1`.`leaderboard`,`s1`.`user_id`;
答案 0 :(得分:1)
确保在
上有合适的综合索引 table leaderboards (leaderboard, score)
并且你不应该使用select中没有参与聚合函数的列而不是group by子句中提到的列 因为这会为这些列产生不可预测的结果 这种习惯在SQL中被弃用,并且在最新版本的mysql中产生错误
SELECT `s1`.`leaderboard`,`s1`.`user_id`, COUNT(DISTINCT `s2`.`score`) AS `rank`
FROM `leaderboards` `s1`
JOIN `leaderboards` `s2` ON `s1`.`score` <= `s2`.`score`
AND `s1`.`leaderboard` = `s2`.`leaderboard`
GROUP BY `s1`.`leaderboard`,`s1`.`user_id`;
答案 1 :(得分:0)
try as below:
ALTER TABLE `leaderboards` ADD INDEX (`leaderboard`);
SELECT `s1`.*,COUNT(DISTINCT `s2`.`score`) AS `rank`
FROM `leaderboards` `s1`
LEFT JOIN `leaderboards` `s2`
ON(`s1`.`score` <= `s2`.`score` AND `s1`.`leaderboard` = `s2`.`leaderboard`)
GROUP BY `s1`.`leaderboard`,`s1`.`user_id`;