MySQL如何实现"分组"?

use*_*916 7 mysql

我从MySQL参考手册中读到并发现当它可以使用索引时,它只是进行索引扫描,其他它将创建tmp表并执行诸如filesort之类的操作.我还从其他文章中读到,"分组依据"结果默认按列分组排序,如果添加"order by null"子句,则不会删除文件.差异可以从"解释......"条款中找到.所以我的问题是:"group by"子句与"order by null"之间有什么区别? 我尝试使用分析来查看mysql在后台执行的操作,并且只看到如下结果:

result for group clause without order by null:
|preparing                      | 0.000016 | 
| Creating tmp table             | 0.000048 | 
| executing                      | 0.000009 | 
| Copying to tmp table           | 0.000109 | 
**| Sorting result                 | 0.000023 |** 
| Sending data                   | 0.000027 | 

result for clause with "order by null":
preparing                      | 0.000016 | 
| Creating tmp table             | 0.000052 | 
| executing                      | 0.000009 | 
| Copying to tmp table           | 0.000114 | 
| Sending data                   | 0.000028 | 
Run Code Online (Sandbox Code Playgroud)

所以我猜想当"order by null"添加时,MySQL会做什么,它不使用filesort算法,也许当它创建tmp表时,它也使用索引,然后使用索引按操作分组,完成后,它只是从表行读取结果而不对结果进行排序.

但我原来的意见是MySQL可以使用quicksort对项目进行排序,然后进行分组,因此结果也会被排序.

任何意见表示赞赏,谢谢.

wer*_*erd -1

Group by 是按某列对记录进行分组。例如,您有“class”列,您可以按此列进行分组,这样您将获得根据此列值分组的记录。