【发布时间】:2015-07-23 00:43:22
【问题描述】:
我们有一个包含大约 25,000,000 行的表,称为“事件”,具有以下架构:
TABLE events
- campaign_id : int(10)
- city : varchar(60)
- country_code : varchar(2)
以下查询需要很长时间(> 2000 秒):
SELECT COUNT(*) AS counted_events, country_code
FROM events
WHERE campaign_id` in (597)
GROUPY BY city, country_code
ORDER BY counted_events
我们发现这是因为 GROUP BY 部分。
(campaign_id, city, country_code) 上已有一个索引 idx_campaign_id_city_country_code 已使用。
也许有人可以提出一个很好的解决方案来加快速度?
更新:
'解释'表明在许多可能的索引中,MySql 使用了这个:'idx_campaign_id_city_country_code',对于它显示的行:'471304',对于'Extra',它显示:'Using where;使用临时的;使用文件排序' -
这是 EXPLAIN 的全部结果:
- id:'1'
- select_type: '简单'
- 表:“事件”
- 类型:'ref'
- possible_keys: 'index_campaign,idx_campaignid_paid,idx_city_country_code,idx_city_country_code_campaign_id,idx_cid,idx_campaign_id_city_country_code'
- 键:'idx_campaign_id_city_country_code'
- key_len: '4'
- 参考:'const'
- 行数:'471304'
- 额外:'使用where;使用临时的;使用文件排序'
更新:
好的,我想已经解决了:
再次查看此处粘贴的查询,我意识到我忘记在这里提到 SELECT 中还有一个名为“country_name”的列。所以当时查询很慢(包括 country_name),但我就把它省略了,现在查询的性能绝对没问题。 对不起那个错误!
因此,感谢您提供的所有帮助 cmets,我会为所有好的答案投票!有一些非常有用的补充,我可能也会应用(比如更改类型等)。
【问题讨论】:
-
什么解释 SELECT COUNT(*) AS counted_events, country_code FROM events WHERE campaign_id` in (597) GROUPY BY city, country_code ORDER BY counted_events 给出了什么解释?
-
'Explain' 表明,在许多可能的索引中,MySql 使用了这个:'idx_campaign_id_city_country_code',对于它显示的行:'471304',对于'Extra',它显示:'Using where;使用临时的;使用文件排序'
-
这里的邪恶是
ORDER BY counted_events导致Using temporary; Using filesort' -
要排序的行太多。我认为问题来自数据库设计
-
@TruongHua 有一张表,所以不像有数据库设计。他只需要修复类型和索引。优化后,此查询将运行良好
标签: mysql sql database performance indexing