用 explain 命令查看执行计划的时候,Extra 列的值含有 “using filesort” 表示需要排序,可能是在内存里排序、也可能是磁盘文件排序。MySQL 给每个线程分配一块内存用于排序,称为 sort_buffer ,可以通过参数 sort_buffer_size
调整这个内存的大小。
如果要排序的数据都能放进 sort_buffer 则直接在内存里排序,否则需要借助磁盘临时文件进行辅助排序。
由于 InnoDB 是索引组织表,聚簇索引就是主键索引,下面的描述就用 rowid 替代主键值。
走索引全字段排序
- 初始化 sort_buffer,确定要放入 sort_buffer 的目标字段;
- 根据选择的索引查找满足条件的 rowid;
- 通过rowid到聚簇索引树获取整行数据,取目标字段放入sort_buffer;
- 从选择的索引取下一个记录的rowid;
- 重复步骤 3、4直到不满足条件;
- 对 sort_buffer 中的数据按照排序列进行排序。
- 遍历排序结果,把目标数据返回给客户端。