Mysql在进行分组或者子查询的过程中一般会使用到内部临时表的机制来帮助完成数据的统计,而group by
与union
在这个过程中,也可能会使用到内部临时表来完成数据的统计
Group By的执行流程
分组字段无索引
-
执行语句
select id%10 as m, count(*) as c from t1 group by m;
这个简单的分组语句是将id%10分组进 行统计,并统计每个计算之后的数据的数量,并且会按照m的结果排序后输出。
通过
explain
可以看到:using temporary
表示在执行分组的时候使用了临时表using filesort
表示使用了文件排序(可能是内存排序也可能借助了磁盘文件排序,取决于sort buffer
是否可以放下查询到的数据)
-
执行流程
- 创建内存临时表,并且表里有2个字段,一个字段m,一个字段c,分别用来统计值和对应的数量,并且主键为m
- 扫描t1表的索引a,依次取出叶子节点上的id值(这里不借助其他索引,在主键索引上可以直接完成,所以可以使用到覆盖索引),计算