【**问题描述(
最近阅读了tidb的官方文档,也搜索了一些有关group by,组合索引之类的文档。我们有一个需求,所以可以对上这个问题,举个例子,百亿级别的数据,场景如下,怎么建索引呢?
select sum(pv),user_id,city,product_id,entity_id,sub_id,time_num from tb_pv
where user_id = ‘’ and city = ‘’ and product_id = ‘’ and sub_id = ‘’ and entity_id in () and
time_num between ‘20191001’ and ‘20191101’
group by entity_id,time_num order by … limit ;
2,基于第一点,这个 SQL index reader(索引覆盖)是实现不了的,大概率需要回表,所以索引的主要作用是进行 filter、或者排序;
3,基于第二点,我们选择索引就变成确认下那些条件或者条件组合是过滤强,看上去 user_id = ‘’ and city = ‘’ and product_id = ‘’ and sub_id = ‘’ 这个是强条件,然后后面 entity_id、 time_num 二选一,还是看过滤性谁强,然后和前面的列在一起,进行组合索引,组合索引顺序就你说的,过滤性强的在左边,顺序查询的放最后。
谢谢,那么针对一条sql多范围查询,我只能选择过滤大的留用了。另外还有一个group by的问题。
如果索引列是a,b,c 那么where a = ‘’ and b = ‘’ group by c应该是可以用到a,b,c这个组合索引的。如果where a = ‘’ and b in () and c in () group by b,c呢?
b和c可能就是上面的entity_id和time_num,我们关心的优化点其实有二,一是过滤时是否用到索引,二是分组聚合时是否用到索引。
这种情况,聚合时能用到索引吗?