创建一个表,然后使用查询语句:
查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄

create table 't' ('id' int(11) not null,'city' vachar(16) not null,'name' vachar(16) not null,'age' vachar(16) not null,'addr' varchar(128) default null,primary key('id'),key 'city'('city')
)engine = InnoDB;select city,name,age from t where city = '杭州' order by name limit 1000;

它的执行流程如下:

全字段排序

为了避免全表扫描,需要在city字段上加上索引

假设满足city = '杭州’条件的行是从ID_X到ID_(X+N)的这些记录。
执行流程:
1、初始化sort_buffer,确定放入name、city、age三个字段;
2、从索引city找到第一个满足city = '杭州’条件的主键id,也就是ID_X;
3、到主键id索引取出整行,取name、city、age三个字段值,存入sort_buffer;
4、从索引city取下一个记录的主键id;
5、重复step3、4直到city的值不满足查询条件为止,对应的ID(X+N);
6、对sort_buffer中的数据按照字段name做快速排序
7、按照排序结果取前1000行返回给客户端

tip:sort_buffer是MySQL分配给每个线程用于排序的内存。
sort_buffer是MySQL分配给每个线程用于排序的内存。sort_buffer_size是sort_buffer的大小,如果要排序的数据量小于sort_buffer_size,排序就在内存中完成,如果排序数据量过大,就得使用磁盘临时文件辅助排序。外部排序一般使用归并排序算法。

rowid 排序

全字段排序方法缺点:单行大的话占用内存空间。
通过修改MySQL中专门控制用于排序的行数据的长度的一个参数。意思是,如果单行的长度超过这个值,就会换一种算法

SET max_length_for_sort_data = 16;

新的算法只会讲排序的列(name字段)和主键id放入sort_buffer;
所以排序的结果就少了city和age字段值,不能直接返回。
执行流程如下:
1、初始化sort_buffer,确定放入name和id字段;
2、从city索引中找到第一个满足city = '杭州’条件的主键id,也就是图中的ID_X;
3、到主键id索引取出整行,取name、id两个字段,存入sort_buffer;
4、从city索引取下一条记录的主键id
5、重复step3、4直到不满足city = '杭州’为止
6、对sort_buffer中的数据按照字段name进行排序
7、遍历排序结果,取前1000行,并按照id的值回到原表中取出city、name、age三个字段返回给客户端

rowid 方式和全字段方式一样,需要先把查询到的结果全部放在内存或硬盘中,再使用相关算法进行排序。而排序后由于没有保存所需的字段,需要按顺序使用主键再从索引树上查询,查到一个就返回一个,而不用把所有内容查完放到内存上再一并返回。

两者比较

全字段排序 rowid 排序

如果担心排序内存太小,会影响排序效率,才会采用rowid排序算法,这样排序过程中依次可以排序更多行,但是需要再回到原表去取数据。
如果MySQL认为内存足够大,会优先选择全字段排序,把需要的字段都放到sort_buffer中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表中取数据。

对于InnoDB,rowid排序会要求回表多造成磁盘读,因此不会被优先选择。

《MySQL——order by逻辑(全字段排序与rowid排序)》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. linux下类似chkconfig的命令,Linux系统下chkconfig命令使用详解
  2. JS 提交form表单
  3. Android 原生通知Notification 写法
  4. NSArray ----NSMutableArray
  5. SCM-SVN集成服务器
  6. 详解MOS管、IGBT管,不看就亏大了!
  7. Python元组练习
  8. lab 2 EIGRP Default Route
  9. Python 开发者 2017 应该关注的 7 个类库
  10. 程序员和注册会计师的地位_“注册会计师和律师哪个地位高?”这3张图给出了答案!...
  11. My.WinformMvc,一个 Winform MVC 框架
  12. 猎豹网校 java,猎豹网校JAVA编程思想高级视频教程
  13. php短信接口开发(http协议)
  14. word表格怎么缩小上下间距_word表格间距 在WORD表格中如何将行间距缩小
  15. 苹果手机换电池对手机有影响吗_网上预约手机上门换电池可靠吗?官方回应:售后也这么换!...
  16. CentOS7安装squid代理服务器
  17. matlab示波器模拟,[转载]利用MATLAB命令窗口绘制Simulink仿真示波器波形的方法
  18. Tomcat项目启动后,页面无法显示验证码
  19. 通用嵌入式系统测试平台 ETest简介
  20. MyBatis基础学习知识点2

热门文章

  1. 科学计算机看电量,解密:关于手机电量为1%是如何科学的算出来的?
  2. 用了fastapi还需要nginx_nginx 与 fastdfs 的配置过程,已经越过了许多坑,我跪着进入了欢迎页面。。。...
  3. CSS原理解析之模型篇
  4. line-height与图片底部间隙的学习整理转述
  5. 去除inline-block间隙的几种方法
  6. 单独使用 laydate 日期时间组件
  7. 词云第一次实践,参考学校老师讲的一些知识点还有网上大佬的代码实现
  8. JQuery学习四(过滤选择器)
  9. EYQiPa,梦开始的地方
  10. 【J2EE设计模式】模型-视图-控制器模式(MVC模式)