Mysql - 有效地获取给定id的每个组的最大值

时间:2012-01-20 21:18:03

标签: mysql greatest-n-per-group

我们有一张表格,用于记录某些游戏的用户分数。我们想要的是显示每个用户每场比赛的最高得分。请注意,每个用户可能已经提交了1000多个分数,社区很大(因此用户越来越多)并且有很多游戏。 我们已经在这里使用了类似问题的查询:

SELECT f1.userkey, f1.score, dateachieved, timeachieved, `MA_users`.username
FROM (
      (
        SELECT userkey, max( score ) AS score
        FROM `MA_scores`
        WHERE gameid = '$gameid'
        AND STATUS = 'approved'
        GROUP BY userkey
      ) AS f1
      JOIN (
        SELECT userkey, score, dateachieved AS dateachieved, timeachieved AS timeachieved
        FROM `MA_scores`
        WHERE gameid = '$gameid'
        AND STATUS = 'approved'
        GROUP BY score DESC , userkey
        ORDER BY `score` DESC
      ) AS T2 
      ON f1.userkey = T2.userkey
      AND f1.score = T2.score
)
JOIN `MA_users` ON f1.userkey = `MA_users`.userkey
LIMIT 0 , 20;

上面的问题是它需要一些时间才能完成,因此站点不能快速访问(延迟几秒钟)(因此我们已经看到了mysql的50%cpu使用率)。 我们知道这是已知的最大n组问题,并在这里阅读了一些问题,以及一些博客文章,但它们似乎没有足够提高查询速度。

所以问题是:是否有更有效的查询来检索所需的结果?此外,哪些索引应该与查询一起使用,以便加快速度? (为了避免使用filesort;也使用临时等) 谢谢!

1 个答案:

答案 0 :(得分:0)

不是每次都查询它,而是有一个所谓的Statistics表,其中有两列:userkeymax_score。你可以很容易地回填这个表;诀窍将是让它保持最新。

您可以在MA_scores表上设置触发器,以便插入新行。触发器只需从表userkey中选择MAX(得分)并更新Statistics表。

我不知道这与你现有的架构有什么关系,或者它是否是一个伟大的想法,但它会有快速的读取时间,并且在MA_scores表上有适当的索引,可能是整体来说非常快。