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设计的排序算法。堆排序是不稳定的。
总结:
桶排序、计数排序、基数排序:非比较排序,空间换时间,排序的字段可以是字符串、数字,整形可以这三者,字符串只能用桶排序,如下:
select student_id,sum(score) from mark group by student_id;
select t2.name,sum(t1.score) from mark t1
inner join student t2 on t2.id=t1.student_id
group by t2.name;
堆排序:如
order by xxx limit xxx;
MySQL排序原理与案例分析:https://www.cnblogs.com/cchust/p/5304594.html