MySQL数据排序
MySQL中对数据进行排序有三种方式:
1、常规排序(双路排序)
2、优化排序(单路排序)
3、优先队列排序
优先队列排序使用堆排序算法,利用堆数据结构在所有数据中取出前N条记录。
常规排序和优化排序
常规排序(双路排序):
先对排序列+行指针(RowID或主键)进行排序,再根据行指针取出整行数据。
优点:需要排序的"数据"较小,单个soft buffer中能存放更多记录,排序速度更快
缺点:按照行指针取整行数据时,会产生大量随机IO,影响服务器IO性能
优化排序(单路排序):
先按照行指针取出整行数据,再对数据按照排序列进行排序。
优点:先按照行指针取数时,能顺序读取,减少随机IO操作
缺点:单个soft buffer只能存放更少记录,如果使用
当排序元组小于max_length_for_sort_data时,MySQL才会考虑使用优化排序(单路排序)。
有优化常规排序(双路排序)中随机IO问题,MySQL先将行指针(RowID或主键)进行缓冲排序,合并随机IO为顺序IO,该缓冲大小由参数read_rnd_buffer_size控制。
常规排序和优化排序使用快速排序算法和归并排序算法,先将数据拆分放入sort buffer(该Buffer的大小由参数sort_buffer_size控制)中进行快速排序后存入临时文件,再将多个排序后的临时文件使用归并排序算法进行合并得到最终结果。
PS: 在SHOW PROCESSLIST中出现filesort指数据在内存中排序,并不一定会使用临时文件。
优先队列排序
在MySQL 5.6版本中对LIMIT M,N语句进行优化,由于该语句不需要对所有数据进行排序,仅需要计算出前M+N个值,因此采用堆排序来优化。
对于升序操作,可以采用大顶堆方式计算,对于降序操作,可以采用小顶堆方式计算。
MySQL三种排序算法:
快速排序(Quick Sort)是对冒泡排序的一种改进,基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 堆排序是利用堆的数据结构实现的排序算法,通过调整二叉树上父节点和左右子节点的位置,最终得到一个有序序列
参考链接:
https://www.cnblogs.com/chengxiao/p/6194356.html
https://www.cnblogs.com/chengxiao/p/6129630.html
https://blog.csdn.net/san_er/article/details/46006199