MySQL排序方式与ORDER BY 的简单介绍

1. MySQL排序方式

  1. 文件排序(Using filesort)
    文件排序有两种算法:
    1.1 双路排序:MySQL4.1以前使用的是双路排序,即两次扫描磁盘(两次IO),然后得到数据,第一次IO,读取行指针和ORDER BY列,在buffer中对他们进行排序;第二次IO,扫描已经排序完成的列表,从磁盘中按照列表中的值重新从列表中读取对应的字段数据输出。
    1.2 单路排序:一次IO,从磁盘上读取查询需要的所有列,按照ORDER BY列在buffer中对它们进行排序,然后扫描排序后的列表输出。可能出现的问题是,磁盘中需要排序的数据太大,无法一次在buffer中存储,从而造成多次IO。
  2. 扫描有序索引排序

2. 提高ORDER BY排序速度

  1. 尽量不要select * ,而是仅查询必需的字段,因为select * 会不可避免的使查询结果变大,当查询结果总和小于max_length_for_sort_data且排序字段不是text|bolb类型时,会用单路排序,否则使用双路排序
  2. 提高sort_buffer_size,无论单路排序还是双路排序,都会用到buffer,即MySQL中的sort_buffer,而这两种算法都有可能会超过sort_buffer的容量,超过之后,MySQL会创建tmp文件进行合并排序,导致多次IO,但是单路排序算法的风险更大。
  3. 提高max_length_for_sort_data,提高这个参数,会增加用改进算法的概率,但是如果设太高数据总量超过sort_buffer_size的概率就会增大,从而可能导致多次IO。

如何尽量避免在使用索引过程中,使ORDER BY不产生Using filesort

  1. 在索引列上完成排序操作,并且遵照复合索引字段的顺序来确定ORDER BY的顺序(最佳左前缀原则)。
  2. 排序方式一致,要么全部升序要么全部降序
  3. MySQL能为排序和查找使用相同的索引
  4. 在这里插入图片描述
  5. 在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/TreeCode/article/details/108558824