在日常的业务开发中,使用到MySQL的order by对数据进行排序是一个很正常的行为,那么你知道order by是如何工作的嘛?
一、全字段排序
先创建一张user表,字段name,age,address,插入随机数据100w条记录,由于按照name查询,所以给name字段添加索引:
alter table user add index idx_name (name);
我们看一下这条SQL的Explain的执行计划:
EXPLAIN SELECT name,age,address FROM user WHERE name = 'Olivia Wilson' ORDER BY age
从执行计划中可以看出,Extra字段中'Using fliesort'表示的就是用到了排序,MySQL会给每一个线程分配一块内存用于排序,称为sort_buffer
通常情况下,以上排序的SQL执行流程如下:
- 初始化内存sort_buffer,确定放入字段:name,age,address
- 从name索引树上找到所有满足name='Olivia Wilson’的主键ID
- 到主键id索引树上取出整行,取name,age,address三个字段的值,放入sort_buffer字段中
- 对sort_buffer中字段按照age做快速排序
我们暂且把这个过程称之为全字段排序,因为把所有需要查询的字段都放入到了sort_buffer中进行排序了,以上步骤4中按’age排序’这个动作,可能在内存中完成,也可能需要使用外部排序,这就取决于排序所需要的内存和参数sort_buffer_size
sort_buffer_size: 就是MySQL为排序开辟的一块内存(sort_buffer)的大小。如果排序的数量小于sort_buffer_size,排序就在内存中完成,如果排序数量太大内存放不下,就利用磁盘临时文件辅助排序
标签:sort,name,buffer,流程,age,工作,内存,排序,order From: https://www.cnblogs.com/complexlong/p/18433609