目录
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
设置
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
说点什么
您将是第一位评论人!