Welcome everyone

了解 mysql Sort Buffer

mysql 汪明鑫 709浏览 0评论

order by

根据某一列进行排序

select * from person order by name;

索引命中

尽量命中索引,因为如果在该列建有索引,就无需额外的排序

 

 

创建索引:
create index ix_name on person(name);

再explain:
explain select name from person order by name;

发现extra 用的是 Using index

 

排序原理

sort buffer出场

可以理解排序是在内存中的一块buffer中进行

buffer的大小可以通过 sort_buffer_size 设置

【定义了每个线程排序缓存区的大小,MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部内存)】

show variables like '%buffer%';

可以适当加大sort_buffer_size 进行调优

MySQL遵循“多利用内存,尽量减少磁盘访问”的设计原则。

当sort buffer不足以完成需要的排序时,MySQL会利用磁盘临时文件来辅助排序(使用归并排序算法)。

 

全字段排序 VS  rowid排序

通过设置max_length_for_sort_data可以让MySQL调整排序时所用的算法:

1) 当需要返回的字段组的大小小于设定的max_length_for_sort_data参数时,MySQL执行的是全字段排序。
也就是说,MySQL会先找到满足条件的、包含所有select字段的所有记录,将它们放到sort buffer(或是磁盘临时辅助文件)中,然后执行排序,再返回排序后的结果;

2) 当需要返回的字段组的大小大于设定的max_length_for_sort_data参数时,MySQL执行的是rowid排序。
也就是说,放到sort buffer(或磁盘临时辅助文件)中的数据记录只包含row id和需要排序的字段,排完序后,再根据排序后的结果row id回到主表取出相应的其它要求返回的字段值,再返回给调用方。这种情况下会多出回主表查其它字段数据的过程。

 

mysql 内存结构图

转载请注明:汪明鑫的个人博客 » 了解 mysql Sort Buffer

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz