SQL优化—— 优化order by语句 || Filesort 的优化

两种排序方式

1). 第一种是通过对返回数据进行排序,也就是通常说的 filesort 排序,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。

2). 第二种通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高


多字段排序



了解了MySQL的排序方式,

优化目标就清晰了:尽量减少额外的排序,通过索引直接返回有序数据。

where 条件和Order by 使用相同的索引,并且Order By 的顺序和索引顺序相同,

并且Order by 的字段都是升序,或者都是降序

否则肯定需要额外的操作,这样就会出现FileSort。



Filesort 的优化

通过创建合适的索引,能够减少 Filesort 的出现,但是在某些情况下,条件限制不能让Filesort消失,那就需要加快 Filesort的排序操作。对于Filesort , MySQL 有两种排序算法:

1)两次扫描算法:MySQL4.1 之前,使用该方式排序。首先根据条件取出排序字段和行指针信息,然后在排序区sort buffer 中排序,如果sort buffer不够,则在临时表 temporary table 中存储排序结果。

                               完成排序之后,再根据行指针回表读取记录,该操作可能会导致大量随机I/O操作。

2)一次扫描算法:一次性取出满足条件的所有字段,然后在排序区 sort buffer 中排序后直接输出结果集。排序时内存开销较大,但是排序效率比两次扫描算法要高。

MySQL 通过比较

系统变量 max_length_for_sort_data 的大小和Query语句取出的字段总大小,

来判定是否那种排序算法,

如果max_length_for_sort_data 更大,那么使用第二种优化之后的算法;

否则使用第一种。

可以适当提高 sort_buffer_size 和 max_length_for_sort_data 系统变量,来增大排序区的大小,提高排序的效率。

猜你喜欢

转载自blog.csdn.net/qq_39368007/article/details/114694230
今日推荐