order by是怎样执行的?
以市民表为例,假设查询城市是上海所有人的名字,按照姓名排序返回前1000个人的姓名和年龄。
select city,name,age from t where city = '上海' order by name limit 1000;
全字段排序
explain select city,name,age from t where city = '上海' order by name limit 1000;
查看sql语句的执行情况,Extra字段中的"Using filesort"表示需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。
该语句的执行过程:
- 初始化sort_buffer,确定放入 city name age字段;
- 从索引city上找到第一个满足city='上海’条件的主键id;
- 从主键id索引上取出整行,取name,city,age三个字段的值,存入sort_buffer中;
- 从索引city取出下一个记录的主键id;
- 重复步骤3、4直到city的值不满足查询条件为止;
- 对sort_buffer中的数据按照字段name进行快速排序;
- 将排序结果取前1000行,返回给客户端;
按name排序这个动作,可能在内存中完成,也可能需要使用外部