MySQL filesort原理及优化
MySQL对排序有两种实现方式:利用有序索引获取有序数据和文件排序。在查询分析时,如果MySQL在排序中未使用索引,则输出“using filesort”。文件排序在内存中使用排序算法将获取的数据排序,通过sort_buffer_size系统变量设置的sort buffer(排序区)来实现。每个线程独享这个内存区域,可能存在多个sort buffer。
MySQL排序实现包括双路排序和单路排序。双路排序首先扫描出需要排序的字段并排序,然后根据排序结果再次扫描需要select的列数据,效率不高但节省内存。排序使用快速排序算法,内存不足时将排序结果写入磁盘文件,然后合并。单路排序在MySQL 4.1版本引入,将两次扫描数据操作合并为一次,减少内存使用,但可能耗用更多sortbuffer空间。MySQL 4.1及后续版本同时支持两种算法。
选择排序算法时,MySQL根据max_length_for_sort_data参数大小和查询语句所取出的字段类型大小总和来判定使用哪种算法。如果所有返回字段的大小总和小于max_length_for_sort_data,使用单路排序,否则使用双路排序。设置max_length_for_sort_data参数有助于优化排序效率,特别是在数据库出现大量排序等待、系统负载高和响应时间变长的情况下。
优化文件排序的方法包括:加大max_length_for_sort_data参数设置,去掉不必要的返回字段或减小列长度,增大sort_buffer_size参数设置,增加read_rnd_buffer_size大小,以及改变tmpdir指向多个物理盘目录。这可以减少随机IO操作,提高排序效率。
在查询分析时,如果看到“using filesort”或“using temporary;using filesort”,表示排序过程中没有使用索引,效率较低。因此,尽量避免出现文件排序,遇到这种情况需要考虑优化策略。
多重随机标签