0%

排序优化

排序优化

对于order by关键字进行优化前,首先大家要先知道索引不仅用于检索还用于排序

MySQL支持两种方式的排序,index和filesort,index效率高,可以根据索引本身来完成排序,filesort效率较低

最好在进行explain进行分析时不要出现filesort

使用index的条件

  • order by 语句使用索引最左前列
  • 使用where 子句和order by子句组合满足索引最左前列

如果使用多字段排序,需要保证排序方向一致,要么就全是ASC要么就全是DESC

使用filesort

如果逼不得已使用filesort,MySQL中filesort有两种算法,双路排序和单路排序

双路排序

4.1之前使用的是双路排序,即需要扫描两次磁盘,读取行指针和order by列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对应的数据输出

单路排序

4.1之后出现单路排序,从磁盘中查询所有列,按照order by列在buffer进行排序,然后扫描排序后的列表进行输出

使用单路排序需要保证buffer足够大,因为要把数据放到内存,如果buffer不够大,会导致单路排序变成多路排序

这个buffer在配置文件中为sort_buffer_size配置

当query的字段大小总和小于max_length_for_sort_data且字段中不包含text或者blob类型时,会使用单路排序