前言
业务中的各种查询通常对应了用户所看到的各项列表,列表一般是根据某个维度进行排序。
换句话说,业务中使用 SELECT
语句的时候除了不可避免的搭配 WHERE
以外,还会配合 ORDER BY
进行使用。
今天来好好聊聊 MySQL 的 ORDER BY
排序。
排序算法
说到排序算法,有插入排序、选择排序、归并排序、堆排序、快速排序、计数排序、桶排序、基数排序、冒泡排序、希尔排序、梳排序 ...
关于各种排序算法的排序流程和具体实现,不是本篇博客的重点,不作详细说明。
这里直接贴各类排序算法的时空复杂度:
通常我们实现的这些排序算法,都是在”纯内存“环境中进行。
MySQL 作为数据库难道是在先将所有要排序的数据加载到内存,再应用排序算法吗?
MySQL 的排序方案
在分析 MySQL 的不同的排序方案之前,先来了解 sort buffer 概念。
MySQL 会为每个线程分配固定大小的 sort buffer 用作排序。
sort buffer 是具有逻辑概念的内存区域,大小由 sort_buffer_size
参数控制,默认为 256 kb。
由于 sort buffer 大小固定,而 data(待排序的数据量)并不固定,所以根据 sort buffer 与 data(待排序数据量)的大小差值,可分为内部排序和外部排序:
data <= sort buffer
:即 sort buffer 够用,这时候 MySQL 只需要在内存中进行排序即可。内部排序使用的是快速排序data > sort buffer