图3 union all的explain结果
可以看到,第二行的Extra字段显示的是Using index,表示只使用了覆盖索引,没有用临时表
了。
group by group by 执行流程执行流程
另外一个常见的使用临时表的例子是group by,我们来看一下这个语句:
这个语句的逻辑是把表t1里的数据,按照 id%10 进行分组统计,并按照m的结果排序后输出。它
的explain结果如下:
图4 group by 的explain结果
在Extra字段里面,我们可以看到三个信息:
Using index,表示这个语句使用了覆盖索引,选择了索引a,不需要回表;
Using temporary,表示使用了临时表;
Using filesort,表示需要排序。
这个语句的执行流程是这样的:
1. 创建内存临时表,表里有两个字段m和c,主键是m;
2. 扫描表t1的索引a,依次取出叶子节点上的id值,计算id%10的结果,记为x;
如果临时表中没有主键为x的行,就插入一个记录(x,1);
如果表中有主键为x的行,就将x这一行的c值加1;
3. 遍历完成后,再根据字段m做排序,得到结果集返回给客户端。
这个流程的执行图如下: