使用GROUP BY、AVG等在大型表上执行缓慢的mysql查询

使用GROUP BY、AVG等在大型表上执行缓慢的mysql查询,mysql,performance,sql-tuning,Mysql,Performance,Sql Tuning,我有一个关于一个大表(超过200万行)的查询,需要大约10秒才能完成。有没有办法优化它?查询如下: SELECT DATE_FORMAT(date0, '%Y-%m' ) AS Yr_Mo, DATE_FORMAT(date0, '%p' ) AS AM_PM, province AS Province, SUM( IF( top_ads + left_ads =0, 1, 0 ) ) AS pagesWithRightAdsOnly, AVG( to

我有一个关于一个大表(超过200万行)的查询,需要大约10秒才能完成。有没有办法优化它?查询如下:

SELECT
    DATE_FORMAT(date0, '%Y-%m' ) AS Yr_Mo, 
    DATE_FORMAT(date0, '%p' ) AS AM_PM,
    province AS Province,
    SUM( IF( top_ads + left_ads =0, 1, 0 ) ) AS pagesWithRightAdsOnly, 
    AVG( top_ads ) AS top_ads, 
    AVG( left_ads ) AS left_ads, 
    AVG( right_ads ) AS right_ads
FROM ad_counts
GROUP BY Yr_Mo, AM_PM, Province
“ad_计数”表:

date0 (timestamp)
province(varchar)
keyword_id
number_ads(int)
top_ads (int)
left_ads (int)
right_ads (int)
date0上的索引,但date0不是唯一的

有什么想法吗

编辑: 说明:

id选择\u类型表类型可能的\u键\u长度参考行额外 1简单百度亲广告使用临时统计所有空2160752;使用文件排序
表上有索引吗?@bluefeet,是的,“date0”是索引。我还尝试创建了两个名为Yr_Mo和AM_PM的列,并对它们进行了索引,但没有获得更好的性能。您可以将查询限制为数据的一个子集吗?目前没有太多的优化机会,因为它正在为表中的所有记录提取结果,并且必须读取每条记录。你能发布解释查询的输出吗?在
(Yr\u Mo,AM\u PM,Province)
上创建一个综合索引。优化的最佳方法是有一个单独的表,其中包含每个月的平均值或类似的内容,这些平均值每月只计算一次。 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE baidu_pro_ad_counts ALL NULL NULL NULL NULL 2160752 Using temporary; Using filesort