排序使用的sort_buffer
通过explain查看执行SQL,Extra列中有‘filesort’代表用到了临时表排序,MySQL会给每个线程分配一块内存用于排序,成为sort_buffer
如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。
通过查看 OPTIMIZER_TRACE 的结果中的 number_of_tmp_files 来确认是否使用了临时文件,以及临时文件数量
max_length_for_sort_data
排序时会把select的结果都放入到sort_buffer中,并按照order by字段排序。那如果select的字段太多,导致单行长度太大,占用过多的sort_buffer怎么办?
可以通过max_length_for_sort_data来设置
SET max_length_for_sort_data = 16;
当select的字段和排序的字段长度总和,超过16时,MySQL会优化为将排序字段和主键id字段放入sort_buffer中,不再放入全部的select字段,节省sort_buffer的开销。然后通过id回表查询,将select字段的结果再次取出,最终返回。
这种排序也可以叫做rowid排序,而原来的select字段排序可以叫做全字段排序。
sort_mode:
sort_mode:
order by与覆盖索引
通常order by排序操作的SQL,在explain的Extra列会有Using filesort,代表使用了临时表排序。如果根据where条件查询出的结果已经是按照order by字段有序的,那么就不用再做一次排序了,而联合索引可以实现这个优化。这时候explain的Extra列会显示using index condition,没有了using sortfile。
如果还想优化,可以借助覆盖索引来省去回表操作,这时的explain的Extra列会显示using where ,using index,代表使用了覆盖索引,效率非常高。
