排序如何优化?如何避免排序?using filesort-爱代码爱编程
排序如何优化?如何避免排序?Using filesort
单列索引树,就是按照索引列进行排序的;
联合索引(a, b),先按照 a 字段进行排序,a 字段相同的情况下,再按照 b 字段进行排序。
所以,如果排序的字段上面刚好有索引,并且可以走这个索引的话,那么就不需要再排序了,避免排序了。
但是并不能保证走索引,避免排序,查询的性能就一定高,如果数据量大的情况下,大量的回表操作,执行的速度有可能还不如全表扫描 + 排序。
当然,如果符合覆盖索引,就不用回表了。
如果排序的字段上面没有索引,那么就只能进行排序了,内存排序,文件排序。
假设,sort_buff er 最多只能存储 100 行记录。sort_buffer 默认大小是 256K
当记录小于 100 行的时候,一次性读进sort_buffer,进行排序,排序完成之后,就可以直接返回了,这种情况就是 using tempory,使用内存排序,并没有使用文件排序。
当记录大于 100 行的时候,比如说有 1000 行,sort_buffer 一次性放不下,只能一次排序 100 行,然后将排序后的结果放进一个临时文件里面,file1,然后再对 101 - 200 行进行排序,然后将排序结果再放进一个临时文件里面,file2…最后,将排好序的 10 个文件,进行归并排序,merge合并一下。
这里的思想,跟一道面试题一样:只有 2 G 的内存,你要排序 8 G的数据,怎么做?