由于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操作了

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐