初学MySQL——order by的执行过程

本文详细解析了MySQL中`order by`的执行过程,包括全字段排序和rowid排序的原理。全字段排序在内存充足时能直接返回结果,而rowid排序则适用于内存有限的情况,但会增加磁盘读取。通过覆盖索引可以优化排序性能,减少回表操作。理解这些机制有助于优化查询性能。
摘要由CSDN通过智能技术生成


以市民表为例,假设查询城市是上海所有人的名字,按照姓名排序返回前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。

该语句的执行过程:

  1. 初始化sort_buffer,确定放入 city name age字段;
  2. 从索引city上找到第一个满足city='上海’条件的主键id;
  3. 从主键id索引上取出整行,取name,city,age三个字段的值,存入sort_buffer中;
  4. 从索引city取出下一个记录的主键id;
  5. 重复步骤3、4直到city的值不满足查询条件为止;
  6. 对sort_buffer中的数据按照字段name进行快速排序;
  7. 将排序结果取前1000行,返回给客户端;

全字段排序示意图
按name排序这个动作,可能在内存中完成,也可能需要使用外部

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值