【发布时间】:2014-03-18 22:56:42
【问题描述】:
也许标题没有很好地解释。 我有这个:
users (id, name)
-----------------------
| 1 | User 1 | US |
| 2 | User 2 | US |
| 3 | User 3 | FR |
| 4 | User 4 | IT |
| 5 | User 5 | US |
| ... | ...... | .. |
------------------------
games (game_id, user_id)
---------------
| 1 | 2 |
| 2 | 4 |
| 3 | 1 |
| 4 | 6 |
| ...| ... |
---------------
我需要的是让顶级国家玩游戏,所以回答如下:
1 US 145 games
2 FR 25 games
3 IT 12 games
...
up to 10 results
我的解决方案是这样,但是太慢了(有数百万条记录)
select
distinct(user.country),
count(*) as counter
from games
inner join user on games.user_id = user.id
group by user.country
order by counter DESC
limit 10
【问题讨论】:
-
DISTINCT是关键字,而不是函数。user.country周围的括号是不必要的;它们不影响声明。实际上,这个查询不需要DISTINCT关键字,因为有一个GROUP BY user.country子句。 -
我建议您使用
EXPLAIN来验证查询是否使用合适的索引进行 JOIN 操作。您可以使用EXPLAIN SELECT ...的输出更新您的问题。快速的答案是为 MySQL 提供合适的索引来使用,但是在不知道 MySQL 在做什么的情况下给出这个答案是没有意义的。 -
每个用户大概有多少游戏?表上有哪些索引?
-
下次当您需要性能方面的帮助时,还要在问题中显示
explain plan。
标签: mysql performance inner-join