繁体   English   中英

使用聚合函数优化MYSQL查询

[英]Optimize MYSQL query with aggregate function

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

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内执行的限制/顺序。

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

INDEX(day, ad_group_id, earned)

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

您的PARTITIONING PARTITION BY RANGE(TO_DAYs(day))有每日分区吗? 如果是这样,则可以从该指数开始day

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

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

不要在DOUBLEFLOAT上使用(m,n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM