提高Mysql查询性能

时间:2014-08-14 00:41:51

标签: mysql optimization

我有这个高分表

  

CREATE TABLE IF NOT EXISTS高分( int(11) NOT NULL, 的用户名varchar(50) NOT NULL, 的userid int(6) NOT NULL, 得分int(16) NOT NULL, dateadded timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (,用户名), KEY {得分{1}} {盖{1}} {得分{1}}

它的行数超过200万。当我运行以下查询时,大约需要4.5秒。我希望有人可以通过更改查询,添加/修改索引或更改存储引擎来提高速度。

  

选择      h.userid,h.username AS用户,count(h.username)AS scorecount     从       高分h INNER JOIN       (选择盖子,最小(得分)AS maxscore        来自盖子的高分组)t on h.lid = t.lid和h.score = t.maxscore   按h.username ORDER BY scorecount DESC分组

这里要求的是EXPLAIN: EXPLAIN

3 个答案:

答案 0 :(得分:0)

这是您的查询:

SELECT h.userid, h.username AS user, count(h.username) AS scorecount
FROM highscores h INNER JOIN
     (select lid, min(score) AS maxscore
      FROM highscores
      group by lid
     ) t
     on h.lid = t.lid and h.score = t.maxscore
group by h.username
ORDER BY scorecount DESC;

这似乎是在回答这个问题:"用户在表格中有多少次获得最大(或最低)分数?"。这表明您可以将查询重写为:

select hs.userid, hs.username, count(*) as scorecount
from highscores hs
where not exists (select 1 from highscores hs2 where hs2.lid = hs.lid and hs2.score > hs.score)
group by hs.userid, hs.username
order by scorecount desc;

您现有的索引应该可以正常运行。 userid, username上的索引可以帮助某些数据库引擎,但我不认为MySQL会利用它。

答案 1 :(得分:0)

我所做的是缓存查询,每10分钟更新一次。可能有更好的解决方案,但我无法让查询更快。

答案 2 :(得分:-1)

先生,我不认为在这里调整查询是正确的解决方案。你只是说你在那个得分表中有200万行。你能想象一下你的查询在执行它们时检查每行的单元格/行需要多长时间?

您需要的是数据库规范化和设计表的正确方法

http://en.wikipedia.org/wiki/Database_normalization