数据库学习之order by

1 全字段排序
mysql 会为每个线程分配一块内存用于排序,称为sort_buffer.

select city,name,age from t where city='hangzhou' order by name limit 1000;

步骤一:初始化sort_buffer,放入查询的字段:name, city, age
步骤二:从索引city找到第一个满足city=‘hangzhou’ 条件的主键id
步骤三:从主键id中取出整行数据,取对应的name,city,age三个字段的值,存入是sort_buffer中
步骤四:从索引city取出下一个记录的主键id
步骤五:重复步骤三、四直到city的值不满足查询条件
步骤六:对sort_buffer中的数据按照字段name做快速排序
步骤七:按照排序结果取前1000行返回给客户端
2 rowid排序
当查询的字段过多,使得sort_buffer肯定不足以容纳字段,从而需要使用磁盘的临时文件时,我们希望通过减少放入sort_buffer中的字段,而减少使用磁盘,从而提高效率的方法,叫做rowid排序。
max_length_for_sort_data参数用于控制单行长度,也就是要返回的字段很多时。Mysql 就会把这个排序算法换成rowid排序。
步骤一: 初始化 sort_buffer,确定放入两个字段,即 name 和 id;
步骤二:从索引 city 找到第一个满足 city='杭州’条件的主键 id,也就是图中的 ID_X;
步骤三:到主键 id 索引取出整行,取 name、id 这两个字段,存入 sort_buffer 中;
步骤四:从索引 city 取下一个记录的主键 id;
步骤五:重复步骤 3、4 直到不满足 city='杭州’条件为止,也就是图中的 ID_Y;
步骤六: 对 sort_buffer 中的数据按照字段 name 进行排序;
步骤七:遍历排序结果,取前 1000 行,并按照 id 的值回到原表中取出 city、name 和 age 三个字
段返回给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值