SQL查询:加快大型表的速度

use*_*671 5 mysql sql database indexing performance

我们有一个包含大约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的整个结果:

  • id:'1'
  • select_type:'SIMPLE'
  • 表:'事件'
  • 输入:'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'
  • key:'idx_campaign_id_city_country_code'
  • key_len:'4'
  • ref:'const'
  • 行:'471304'
  • 额外:'使用地点; 使用临时; 使用filesort'

更新:

好的,我认为它已经解决了:

再次查看粘贴的查询,我意识到我忘记在这里提到SELECT中还有一个名为'country_name'的列.所以查询非常慢(包括country_name),但我只是把它留下来,现在查询的性能绝对可以.抱歉,这个错误!

非常感谢您的所有有用的评论,我会提供所有好的答案!有一些非常有用的补充,我可能也应用(如改变类型等).

low*_*nts 0

不要使用IN()- 更好的使用:

WHERE campaign_id = 597
OR campaign_id = 231
OR ....
Run Code Online (Sandbox Code Playgroud)

afaikIN()非常慢。

更新:就像nik0lias评论的那样 -IN()比连接条件更快OR