mysql关于group by语句的优化问题,求思路

想要优化一句关于group by语句,不知道要从何下手,求思路

SELECT

adv_id,
network_id,
SUM(re_click) AS clk,
SUM(deny_click) AS dny_clk,
SUM(re_conver) AS re_ins,
SUM(mat_conver) AS mat_ins,
SUM(def_conver) AS def,
SUM(cost) AS cost,
SUM(earn) AS earn 

FROM ams_data_hourly_2018_03 WHERE start_time BETWEEN 1519862400 AND 1519948799
GROUP BY

adv_id,
network_id

explain:

clipboard.png

索引:

clipboard.png

求大神指点

阅读 3k
4 个回答

1、时间检索结果集小的话就一个start_time单列索引就够了,force一下索引,因为group by会引导mysql走group by字段的索引或者直接全扫。
2、看表名,你这应该是一个分表,如果时间范围直接覆盖了大部分表数据的话什么索引都不用了,全表扫吧,什么三个字段两个字段加索引并没有什么用,时间范围加group by字段的复合索引也只用到了时间字段,只有group by字段的索引就是扫了全表,除非用索引覆盖

试试加FORCE INDEX start_time_adv_id_networkid

把start_time_adv_id_networkid定义为 (start_time, adv_id, network_id)
adv_id要在network_id之前,因为你分组时adv_id在前面.

针对 adv_id,network_id 建个复合索引,不要以 start_time 开始,这样不满足“最左匹配”原则。

adv_id and network_id 联合索引

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题