首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 内部临时表(group by工作原理)

2); 通过上图可以看出,在我们进行union的时候使用了临时表,上述语句执行过程如下: 创建一个内存临时表,临时表只有一个整型字段f,并且f是主键字段 执行第一个子查询,将1000这个值插入临时表中...group by使用内部临时表 explain select id%10 as m, count(*) as c from t1 group by m; 通过上图可以看出,在我们进行group by...之所以需要临时表,是因为id%100的结果是无序的,我们需要一个临时表来统计结果,但是如果可以保证id%100的结果是有序的,那么在计算group by的时候,只需要从左往右顺序扫描。...依次累加: 当碰到第一个1时,可以得出累积了X个0,结果集里面的第一行就是(0, X) 当碰到第二个2时,可以得出累积了Y个1,结果集里面的第二行就是(1, Y) InnoDB的索引就可以满足上述有序条件...by z; group by优化直接排序 如果group by的数据量比较大,先插入内存临时表一部分数据后,发现内存临时表放不下了需要再转成磁盘临时表,这部分过程也是耗时的,那么如何让group

3.3K40

临时表和文件排序实现 group by

本文是 group by 实现过程分析的第 2 篇文章,第 1 篇是 MySQL 怎么用索引实现 group by? <- 点击阅读 了解 MySQL 内部临时表中包含什么字段?为哪些字段建立索引?...<- 点击阅读 接下来,我们一起来看看 ③ ④ 两种方式(临时表 + 文件排序、文件排序)是怎么实现 group by 的。 2....Item_field 已关联 Field 第 2 步,创建临时表。...只使用文件排序的执行过程 第 1 步,读取 t_group_by 表中所有符合条件的记录并进行排序。 第 2 步,读取一条已经排好序的记录,并判断上一个分组是否结束。...看过使用索引实现 group by 那篇文章的小伙伴应该能发现,上面的执行过程中的第 2 ~ 4 步和紧凑索引扫描方式是一样的。 5.

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mysql group by实现方式(一) - 临时表

    当MySQL Query Optimizer无法找到可以利用的合适索引时,就不得不先读取需要的数据,然后通过临时表来完成GROUP BY操作 例如 EXPLAIN SELECT max(gmt_create...) FROM group_message WHERE group_id > 1 and group_id GROUP BY user_id \G ********** 1. row *****...32 Extra: Using where; Using index; Using temporary; Using filesort 执行计划说明MySQL通过索引找到了所需的数据,然后创建了临时表,...所以MySQL无法根据索引的顺序来帮助GROUP BY的实现,只能先通过索引范围扫描得到需要的数据,将数据存入临时表,然后再进行排序和分组操作来完成GROUP BY 针对这种情况的优化,必须要有足够的sort_buffer_size...供排序时使用,而且尽量不要进行大结果集的GROUP BY操作,因为如果超出系统设置的临时表大小就会出现将临时表数据复制(copy)到磁盘上面再进行操作的情况,这时的排序分组操作性能将成数量级的下降

    2K60

    group by 报错_group by null

    (rand(0)*2))x,count(*) from (select 1 union select 2 union select 3)a group by x; //数据不足三条或者关键表被禁用 round...min(@a:=1) from test group by concat(0x5e,@@version,0x5e,@a:=(@a+1)%2); 语句随机应变 函数 group by:分组方式,作为虚拟表的主键...rand汉再计算一次 结合floor(rand(0)*2)是有规律的随机数,也就是说: select floor(rand(0)*2)x,count(*) from test group by x...(select floor(rand(0)*2) as x,count(*) from test group by x) 当查询第一个数据时,x的第一个值是0,在虚拟表中没有这个数据,所以插入数据,count...(rand(0)*2)不会被再次计算 继续查询数据,此时x值为0,虚拟表中不存在0,所以要插入新数据,此时floor(rand(0)*2)再次被计算,值为1,但是floor(rand(0)*2

    1.3K10

    【死磕Sharding-jdbc】---group by结果合并(2)

    在sharding-jdbc源码之group by结果合并(1)中主要分析了sharding-jdbc如何在GroupByStreamResultSetMerger和GroupByMemoryResultSetMerger...中选择,并分析了GroupByStreamResultSetMerger的实现;接下来分析GroupByMemoryResultSetMerger的实现原理; 通过sharding-jdbc源码之group...,在多少个实际表上执行,resultSets的size就有多大; memoryResultSetRows = init(resultSets);} 在实际表torder0和torder1上执行SQL...,即2个实际表每个实际表3条结果,总计6条结果 for (ResultSet each : resultSets) { while (each.next()) {...// each就是遍历过程中的一条结果,selectStatement.getGroupByItems()即group by项,即status,将结果和group by项组成一个GroupByValue

    75720

    为什么 GROUP BY 之后不能直接引用原表中的列

    #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tbl_student_class.cname...为什么 GROUP BY 之后不能直接引用原表(不在 GROUP BY 子句)中的列 ? 莫急,我们慢慢往下看。...为什么聚合后不能再引用原表中的列   很多人都知道聚合查询的限制,但是很少有人能正确地理解为什么会有这样的约束。...表 tbl_student_class 中的 cname 存储的是每位学生的班级信息,但需要注意的是,这里的 cname 只是每个学生的属性,并不是小组的属性,而 GROUP BY 又是聚合操作,操作的对象就是由多个学生组成的小组...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    1.7K10

    理解group by

    先来看下表1,表名为test: 表1   执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name   你应该很容易知道运行的结果,没错,就是下表2:...表2   可是为了能够更好的理解“group by”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。...2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行...(2)我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。...number列执行sum操作,即2+3,返回5,最后执行结果如下: (5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段

    1.1K10

    Group by 分组详解

    先来看下表1,表名为test: 表1   执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name   你应该很容易知道运行的结果,没错,就是下表2:...表2   可是为了能够更好的理解“group by”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。...2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行...(2)我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。...number列执行sum操作,即2+3,返回5,最后执行结果如下: (5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段

    1.7K10

    group by如何优化?

    如果数据量很大,group by的执行速度就会很慢,要想优化这种情况,还得分析为什么group by 需要临时表?...例如,我们有个表的记录id列是: 0,0,0,1,1,2,2,2,2,3,4,4, 当我们使用group by的时候,就直接从左到右,累计相同的值即可。这样就不需要临时表了。...所以,使用索引可以帮助我们去掉group by依赖的临时表 02 group by优化---直接排序 如果我们已经知道表的数据量特别大,内存临时表肯定不足以容纳排序的时候,其实我们可以通过告知group...昨天的文章中我们分析了union 语句会使用临时表,今天的内容我们分析了group by语句使用临时表的情况,那么MySQL究竟什么时候会使用临时表呢? MySQL什么时候会使用内部临时表?...1、如果语句执行过程可以一边读数据,一边直接得到结果,是不需要额外内存的,否则就需要额外的内存,来保存中间结果; 2、如果执行逻辑需要用到二维表特性,就会优先考虑使用临时表。

    2.3K60
    领券