1:利用索引来避免排序
在需要排序的字段上面建立了合适的索引,或者查询语句中使用的索引字段和排序字段一致;
2:filesort排序
sort_buffer_size:一次性分配设置的内存,决定filesort排序分成多少个thread;
max_length_for_sort_data:决定采用双路还是单路排序
2.1 双路排序:两次IO操作,省内存,费时间。排序采用快速排序,当sort buffer满了之后,放到临时文件中,最后利用归并算法排序;优化:对第二次操作,通过id进行IO取出要查询的字段,这时,对于第二次MySQL本身一个优化,即在捞之前首先将id排序(rowid),并放入缓冲区,这个缓存区大小由参数read_rnd_buffer_size控制,然后有序去捞记录,将随机IO转为顺序IO。
2.2 单路排序:一次取出所有的查询字段和排序字段,费内存,省时间。排序采用快速排序,当sort buffer满了之后,放到临时文件中,最后利用归并算法排序;
2.3 堆排序: 针对order limit M,N设计的排序算法。堆排序是不稳定的。