首先,根据解释查询计划,在mysql里对order by的排序可以大致分为两种(explain的extra字段标明),一种是using index,一种是using filesort。
1 using index
在这种排序方式中,我们进行的order by是针对有序索引而言的,不论是主键索引还是普通索引。
也就是说,只要查询的列数据可以直接从索引里面得到,那么就是直接通过索引进行排序。
2 using filesort
在我们所需要的排序数据,不能由索引直接提供的话,那么就通过索引或者全盘扫描取出我们所需要排序的字段以及主键,放入sort buffer(sort buffer是存放于服务器内存,每个线程各有自己的sort buffer),如果sort buffer存放的下,就进行排序,在这个过程中,使用的是快速排序算法
当我们存放不下时,先用快速排序将数据进行排序,将数据放入临时文件,并且最终用归并排序将临时文件与sort buffer合并。最终返回结果集。
3 distinct
distinct关键字的去重实际上就是使用order by去实现的,他会依次检查每一行,如果与前一行相同就丢弃,不同就保留。
特别地,当sql语句使用了group by时,不会通过order by,而是会首先对表进行排序,然后将排序后的表按照每一行的字段值进行分组。在每个分组里,由于这些值都相同,所以在结果集里只需要保留一个值。这样,我们就得到了去重后的结果集。