我们有一个包含大约25,000,000行的表,称为'events',具有以下模式:
TABLE events
- campaign_id : int(10)
- city : varchar(60)
- country_code : varchar(2)
Run Code Online (Sandbox Code Playgroud)
以下查询需要很长时间(> 2000秒):
SELECT COUNT(*) AS counted_events, country_code
FROM events
WHERE campaign_id` in (597)
GROUPY BY city, country_code
ORDER BY counted_events
Run Code Online (Sandbox Code Playgroud)
我们发现这是因为GROUP BY部分原因.
已经使用了索引idx_campaign_id_city_country_code (campaign_id, city, country_code).
也许有人可以提出一个很好的解决方案来加速它?
更新:
'Explain'表明,在许多可能的索引中,MySql使用了这个:'idx_campaign_id_city_country_code',对于它显示的行:'471304'和'Extra'它显示:'使用where; 使用临时; 使用filesort' -
这是EXPLAIN的整个结果:
更新:
好的,我认为它已经解决了:
再次查看粘贴的查询,我意识到我忘记在这里提到SELECT中还有一个名为'country_name'的列.所以查询非常慢(包括country_name),但我只是把它留下来,现在查询的性能绝对可以.抱歉,这个错误!
非常感谢您的所有有用的评论,我会提供所有好的答案!有一些非常有用的补充,我可能也应用(如改变类型等).