How is data sorting implemented in MySQL?
Answer
排序过程中,如果排序字段命中索引,则利用索引排序
反之,使用文件排序
文件排序中,如果数据量少则在内存中排序,具体是使用单路排序或者双路排序
如果数据大则利用磁盘文件进行外部排序,一般使用归并排序
拓展知识
MySQL可以分为索引排序和filesort
索引排序
如果查询中的ORDER BY子句包含的字段已经在索引中,并且索引的排列顺序和ORDER BY子句一致,则可直接利用索引进行排序。这种方式效率高,因为索引有序。
filesort
当使用explain分析SQL发现执行计划的extra中包含using filesort的时候,说明它无法应用索引的顺序,而主动排序了。
如果需要排序的数据比较少,则直接在内存中通过sort_buffer就能排了。具体是通过sort_buffer_size参数来控制sort_buffer的大小,如果需要排序的数据量小于sort_buffer则直接在内存中排序,反之需要利用磁盘临时文件排序,性能就比较差了。
内存排序
双路排序
有一个叫max_length_for_sort_data参数,默认是4096字节,如果select列的数据长度超过它,则MySQl采用row_id排序,即把row_id(有主键就是主键)+排序字段放置到sort_buffer中排序。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JasmineRain's blog!
评论
