使用GROUP BY、AVG等在大型表上执行缓慢的mysql查询
我有一个关于一个大表(超过200万行)的查询,需要大约10秒才能完成。有没有办法优化它?查询如下:使用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
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