我有这个高分表
CREATE TABLE IF NOT EXISTS
高分(
盖int(11) NOT NULL,
的用户名varchar(50) NOT NULL,
的useridint(6) NOT NULL,
得分int(16) NOT NULL,
dateaddedtimestamp 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:
答案 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万行。你能想象一下你的查询在执行它们时检查每行的单元格/行需要多长时间?
您需要的是数据库规范化和设计表的正确方法