order by是如何排序的
1. 索引排序
如果使用索引排序速度非常快
条件: 索引排序的要求就是在索引中可以筛选数据, 但不是100%, 因为优化器可能会有其他选择
2. filesort
select a,d,f from t2 where a = "sanjin" order by d;
2.1 内存 (排序数据 < sort_buffer_size)
2.1.1 行数据 < max_length_for_sort_data
-
根据 a="sanjin" 查询出主键 ID
-
回表查询 a, d, f, 加载到内存中
-
继续下一条主键 ID, 回表
-
在 sort_buffer 中排序
-
返回内存数据
2.1.2 行数据 > max_length_for_sort_data
-
根据 a="sanjin" 查询出主键 ID
-
回表查询 d, 加载到内存中
-
继续下一条主键 ID, 回表
-
在 sort_buffer 中根据 d 排序
-
回表查询 a, d, f
-
返回内存数据
2.2文件 (排序数据 > sort_buffer_size)
-
根据 a="sanjin" 查询出主键 ID
-
回表查询 d, 加载到内存
-
如果内存未满继续重复1, 2
-
如果内存满了, 根据 d 排序, 将局部有序 ID 和 d 保存到一个临时文件
-
继续从1开始重复 ... 直到查询完毕, 得到了一个个局部有序的临时文件
-
根据 d 归并排序, 将最终的结果保存到一个最终文件中, 这个文件保存了 ID 和 d
-
根据 ID 回表查询并且直接发送给客户端