在执行计划中,可能经常看到有Extra列有filesort,这就是使用了文件排序,这当然是不好
的,应该优化,但是,了解一下他排序的原理也许很有帮助,下面看一下filesort的过程:
1、根据表的索引或者全表扫描,读取所有满足条件的记录
2、对与每一行,存储一对儿值到缓冲区,一个是排序的索引列的值,即order by用到
的列值,和执向该行数据的行指针,缓冲区的大小为sort_buffer_size大小
3、当缓冲区满后,运行一个快速排序(qsort)来将缓冲区中数据排序,并将排序完的
数据存储到一个临时文件,并 保存一个存储块儿的指针,当然,如果缓冲区不满,
则不会重建临时文件了
4、重复以上步骤,直到将所有行读完,并建立相应的有序的临时文件
5、对块级进行排序,这个类似与归并排序算法,只通过两个临时文件的指针来不断交换
数据,最终达到两个文件,都是有序的
6、重复5,直到所有的数据都排序完毕
7、采取顺序读的方式,将每行数据读入内存,并取出数据传到客户端,这里读取数据时
并不是一行一行读,读如缓存大小由read_rnd_buffer_size来指定
这就是filesort的过程,采取的方法为: