我有一个简单的查询,但另一方面却相对较大。 在这里:
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内执行的限价/定单。
总结一下: 如果可能的话,我需要在大表上按总和排序。
答案 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
。