多个字段,以及max 和 group by优化

大约有100w的数据,a,b,c,income,begin,end等字段,其中 a,b,c的组合(例如中国/广东省/广州市或者中国/广东省/深圳市)每一天都会记录一行income字段的数据,目的是指定一段时间内income字段最大的一行。
分别建立了两个联合索引a,b,c和begin,end,后续单独建立了一个d的索引,查询依旧很慢。
通过如下sql,大约耗时18s,请教各位,这种sql如何优化呢?谢谢

select a,b,c,max(income) from t1 where begin >= '2021-03-01' and end <= '2021-04-25' group by a,b,c

以下是 explain 结果

           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: index
possible_keys: t1_a_b_c_idx,t1_begin_end_idx
          key: t1_a_b_c_idx
      key_len: 150
          ref: NULL
         rows: 835594
     filtered: 16.66
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
阅读 5.5k
2 个回答

如果a,b,c的组合是形如行政区域,具有级联关系的,建议另外建一张映射表(id,a,b,c),上面的统计表再用id分组和关联,因为前面两个字段的区分度太低,且占用空间。

一个不算优化的优化,加上order by null取消group by后的排序:

select a,b,c,max(income) from t1 where begin >= '2021-03-01' and end <= '2021-04-25' group by a,b,c order by null;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题