执行组子句的最一般方法是首先扫描整个表,然后创建一个新的临时表。表中每组的每一行都应该是连续的。最后,使用这个临时表来查找组并应用聚合函数(如果有聚合函数)。在某些情况下,MySQL可以通过访问索引而得到结果而不创建临时表。

1.loose索引扫描

1。满意的条件

查询指向一个表。

组使用索引中最左边的前缀。

只能使用MIN()和马克斯()聚合函数,它们都指向同一列。

2。例子

表T1(C1,C2,C3,C4)有一个索引idx(C1,C2,C3):


从C1组选择C1,C2,C2;

从T1中选择不同的C1,C2;

从C1组中选择C1,min(C2);

从T1中选择C1、C2,其中C1组为C1,C2为;

从T1中选择max(C3)、min(C3)、C1、C2,其中C2常量;

从T1中选择C2,其中C1组为C1,C2为;

从T1中选择C1、C2,其中C1 = const组由C1,C2;




不满意的条件的例子:

1。除了MIN()或马克斯(),还有其他的累积函数,如:


从C1组中选择C1,和(C2);




2中的域。按组子句不引用索引的开始,例如:




从t1组选择C2,C3,C1,C2;



3。查询是指组后面的键的一部分,不等于常量相等,例如:


从C1组中选择C1,C3,C1,C2;



二、紧凑型指数扫描

如果不满足松散索引扫描的条件,则组的执行仍然不能创建临时表。如果WHERE子句中有范围条件,则该方法只读取满足这些条件的关键字。

否则,将对索引进行扫描。此方法读取WHERE子句定义的范围。

1中存在漏洞。组,但它已覆盖条件C2 = A。


选择C1,C2,C3从T1 C2 = 'a'group C1。




2。组对最左边的前缀不满意,但是有一个条件提供元素的常量:


选择C1,C2,C3从T1 C1 = 'a'group C2。