使用聚合函数优化MYSQL查询

时间:2018-11-12 22:34:02

标签: mysql performance

我有一个简单的查询,但另一方面却相对较大。 在这里:

select `stats_ad_groups`.`ad_group_id`, 
    sum(stats_ad_groups.earned) / 1000000  as earned 
from `stats_ad_groups` 
    where `stats_ad_groups`.`day` between '2018-01-01' and '2018-05-31' 
group by `ad_group_id` order by earned asc
limit 10

这是表结构:

CREATE TABLE `stats_ad_groups` (
  `campaign_id` int(11) NOT NULL,
`ad_group_id` int(11) NOT NULL,
`impressions` int(11) NOT NULL,
`clicks` int(11) NOT NULL,
`avg_position` double(3,1) NOT NULL,
`cost` int(11) NOT NULL,
`profiles` int(11) NOT NULL DEFAULT 0,
`upgrades` int(11) NOT NULL DEFAULT 0,
`earned` int(11) NOT NULL DEFAULT 0,
`day` date NOT NULL,
PRIMARY KEY (`ad_group_id`,`day`,`campaign_id`)
)

这里也有按范围划分的分区,但我排除了分区,以免浪费空间:)

我在这里写的查询大约在9秒钟内执行。您知道一些改善方法吗? 如果我不通过200ms内执行的限价/定单。

总结一下: 如果可能的话,我需要在大表上按总和排序。

1 个答案:

答案 0 :(得分:1)

INDEX(day, ad_group_id, earned)

处理WHERE并且正在“覆盖”。

您的PARTITION BY RANGE(TO_DAYs(day))分区是否具有每日分区?如果是这样,可以从该索引中删除day

有了该索引,PARTITIONing不会为查询提供额外的性能。

要显着提高速度,请构建并维护一个汇总表,该表的日期为ad_group_id,为SUM(赢得)。 More

请勿在{{1​​}}或(m,n)上使用DOUBLE