由于GROUP BY实际上也同样须要进行排序操作,而且与ORDER BY相比,GROUP BY主要只是多了排序之后的分组操作。所以,在GROUP BY的实现过程中,与ORDER BY一样可以利用索引
例如有一个索引idx(c1,c2,c3)
SELECT c1, c2 FROM t1 WHERE c1 < 10 GROUP BY c1, c2;
这条查询就可以直接使用索引扫描完成
使用索引扫描需要什么条件?
(1)查询针对一个单表
(2)GROUP BY条件字段必须处在同一个索引中最前面的连续位置
(3)如果引用到了该索引中GROUP BY条件之外的字段条件,它就必须以常量形式存在
(4)在使用GROUP BY 的同时,如果有聚合函数,只能使用 MAX 和 MIN 这两个聚合函数,并且它们均指向相同的列
(5)当 GROUP BY 条件字段不是索引前缀部分的时候,where 中的条件字段需包含缺失的索引键,且是一个常量
例如 SELECT c1, c2 FROM t1 WHERE c2 = 10 GROUP BY c1, c3;
此GROUP BY使用c1, c3,缺失c2,不符合最左前缀原则,但where条件中有c2,并且条件值是个常量,所以就满足条件,可以使用索引完成group by操作了