MySQL排序方式与ORDER BY 的简单介绍
分类:
文章
•
2024-12-29 17:07:46
1. MySQL排序方式
- 文件排序(Using filesort)
文件排序有两种算法:
1.1 双路排序:MySQL4.1以前使用的是双路排序,即两次扫描磁盘(两次IO),然后得到数据,第一次IO,读取行指针和ORDER BY列,在buffer中对他们进行排序;第二次IO,扫描已经排序完成的列表,从磁盘中按照列表中的值重新从列表中读取对应的字段数据输出。
1.2 单路排序:一次IO,从磁盘上读取查询需要的所有列,按照ORDER BY列在buffer中对它们进行排序,然后扫描排序后的列表输出。可能出现的问题是,磁盘中需要排序的数据太大,无法一次在buffer中存储,从而造成多次IO。
- 扫描有序索引排序
2. 提高ORDER BY排序速度
-
尽量不要select * ,而是仅查询必需的字段,因为select * 会不可避免的使查询结果变大,当查询结果总和小于max_length_for_sort_data且排序字段不是text|bolb类型时,会用单路排序,否则使用双路排序
-
提高sort_buffer_size,无论单路排序还是双路排序,都会用到buffer,即MySQL中的sort_buffer,而这两种算法都有可能会超过sort_buffer的容量,超过之后,MySQL会创建tmp文件进行合并排序,导致多次IO,但是单路排序算法的风险更大。
-
提高max_length_for_sort_data,提高这个参数,会增加用改进算法的概率,但是如果设太高数据总量超过sort_buffer_size的概率就会增大,从而可能导致多次IO。
如何尽量避免在使用索引过程中,使ORDER BY不产生Using filesort
- 在索引列上完成排序操作,并且遵照复合索引字段的顺序来确定ORDER BY的顺序(最佳左前缀原则)。
- 排序方式一致,要么全部升序要么全部降序
- MySQL能为排序和查找使用相同的索引

