大量条目以指数方式丢失性能

时间:2018-05-16 10:45:11

标签: mysql

我在此查询中的表现非常差,以获得每个排行榜的玩家排名。它随着条目数量的增长呈指数级增长(如预期的那样)。 有没有办法优化这个?我认为我可以在每次更新时计算这个字段作为替代:

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`;

2 个答案:

答案 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`;