1. Order By原理
1.1 MySQL的排序方式
按照排序原理分,MySQL排序方式分两种:
- 通过有序索引直接返回有序数据
- 通过Filesort进行排序
我们可以使用explain来查看该排序SQL的执行计划,主要看Extra字段:
- 如果该字段里显示是Using index,则表示通过有序索引直接返回有序数据;
- 如果该字段里显示是Using filesort,则表示该SQL通过filesort进行排序;
1.2 Filesort是在内存中还是在磁盘中完成排序的?
filesort并不一定是在磁盘文件中进行排序,也有可能在内存中排序,内存排序还是磁盘排序取决于排序的数据大小和sort_buffer_size配置的大小:
- 如果“排序的数据大小” < sort_buffer_size:内存排序
- 如果“排序的数据大小” > sort_buffer_size:磁盘排序
1.3 怎么确定使用Filesort排序的SQL是在内存中还是在磁盘中进行?
可以使用trace进行分析,关注number_of_tmp_files字段,如果等于0,则表示排序过程没使用临时文件,在内存中就完成排序;如果大于0,则表示排序过程中使用了临时文件。如下图number_of_tmp_files等于0
,表示未使用临时文件进行排序,所以是内存排序。