我们有一张表格,用于记录某些游戏的用户分数。我们想要的是显示每个用户每场比赛的最高得分。请注意,每个用户可能已经提交了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;也使用临时等) 谢谢!
答案 0 :(得分:0)
不是每次都查询它,而是有一个所谓的Statistics
表,其中有两列:userkey
和max_score
。你可以很容易地回填这个表;诀窍将是让它保持最新。
您可以在MA_scores
表上设置触发器,以便插入新行。触发器只需从表userkey
中选择MAX(得分)并更新Statistics
表。
我不知道这与你现有的架构有什么关系,或者它是否是一个伟大的想法,但它会有快速的读取时间,并且在MA_scores
表上有适当的索引,可能是整体来说非常快。