Filesort的优化
通过创建合适的索引,能够减少FILESORT出现,但是在某些情况下,条件限制不能让filesort消失,那就需要想办法加快filesort操作,对于filesort,MySQL有两种排序算法
两次扫描算法
首先根据条件取出排序字段和行指针信息,之后在排序区sort buffer中排序。如果排序去不够则在临时表中存储排序结果。完成排序后根据行指针回表读取记录。第一次排序获取排序字段和行指针信息,第二次根据指针获取记录,尤其是第二次读取操作可能导致大量的I/O操作,优点是排序的时候内存开销较少。
一次扫描算法
一次性取出满足条件的行的所有字段,然后在排序去sort buffer中排序,后直接输出结果集,排序的时候内存开销较大,但是排序效率比两次扫描算法要高。
MySQL通过比较系统变量max_length_for_sort_data的大小和query语句取出的字段总大小来判断使用那种排序算法,如果max_length_for_sort_data更大,那么使用第二宗优化之后的算法,否则使用第一种算法。适当的加大系统变量max_length_for_sort_data的值,能够让MySQL选择更优化的filesort排序,但是设置过大会导致CPU利用率过低和磁盘I/O过高。适当加大sort_buffer_size排序区,尽量让排序的内存中完成,而不是通过创建临时表放在文件中进行;然而也不能无限制加大sort_buffer_size排序去,因为sort_buffer_size参数是每个线程独占的,过大会导致服务器SWAP严重。尽量只使用必要的字段,select具体的字段名称,而不是select *选择所有字段,这样也可以减少排序去的使用,提高SQL性能