前提:在MYSQL 8 以及之后,group by 不会再进行order by 了,所以如果我们不需要排序,那么无须再进行order by null 。
group by 详解:
如果有索引,那么就会走索引,如果没有索引那么会走全表扫描,此时会有个临时表。
走临时表的情况:
取出每一条数据,然后对age做一个唯一索引,每次取出的数据都与updateTime进行对比,如果比它大,那么就会替换到旧值。
走索引的情况:
因为索引本身就是根据age来排序的,这个时候无须建立临时表,只需要在server层进行判断updateTime的大小即可。
所以说group by必须对分组的数据进行聚合运算。
一. 首先我们上数据表
然后我们上SQL,这个SQL是有带索引的。(age)
很明显,他是根据age的b+树来进行排序的。
1.首先是基于临时表的group by
如果没有走索引的话,那么会有个临时表, 那么是根据主键的顺序的排序的
这种情况是没有走索引的, 直接走主键索引,那么就会创建临时表,和上面描述的情况一样。
2.基于B+树的数据结构形式,排列出来的顺序是不一致的
这种情况是第一张图的情况,这种情况是走索引的
总结:如果创建临时表(相当于数组,按照进入的顺序),如果是走的B+树,那么此时就是主键的顺序。如果是走索引,这时候的顺序就是分组的顺序