大约有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)
如果a,b,c的组合是形如行政区域,具有
级联关系
的,建议另外建一张映射表
(id,a,b,c),上面的统计表再用id分组和关联,因为前面两个字段的区分度太低,且占用空间。一个不算优化的优化,加上
order by null
取消group by后的排序: