优化group by查询的时候,一般的会想到两个名词:松散索引扫描(Loose Index Scan)和紧凑索引扫描(Tight Index Scan),因为通过这两种索引扫描就可以高效快速弟完成group by操作。
松散索引扫描(Loose Index Scan):
松散索引扫描只需要读取很少量的数据就可以完成group by操作,因而执行效率非常高。使用松散索引扫描需要满足以下条件:
1.group by的字段需要在同一索引上,且满足前缀索引,且聚集函数的字段应该位于group by的字段后面. 索引index(a,b,c); select max(c) from test group by a,b
2.select字段中只能含有 min,max(如果同时存在min,max,则只能作用于同一字段),AVG(DISTINCT column),SUM(DISTINCT column),COUNT(DISTINCT column)
3.如果查询中存在除了group by指定的列之外的其他部分,那么必须以常量的形式出现或者除了上面的聚集函数; 索引index(a,b,c); select a,c from test where c = 3 group by a,b 或者 select a,avg( DISTINCT c) from test group by a,b;
紧凑索引扫描(Tight Index Scan)
紧凑索引扫描可能是全索引扫描或者范围索引扫描,取决于查询条件。紧凑索引会取出满足条件的所有索引,然后才会进行分组. 一般会出现 using index,using where. 是否出现using where取决于是否有 where条件.
松散索引扫描个紧凑索引扫描的最大区别是是否需要扫描整个索引或者整个范围扫描。