志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

  • 优美的音乐节奏带你浏览这个效果的编码过程
  • 坚持每一天,是每个有理想青年的追求
  • 追寻年轻人的脚步,也许你的答案就在这里
  • 如果你迷茫 不妨来瞅瞅这里

1 前言

如下我这里有一张抽题记录表,部分建表语句如下:

CREATE TABLE `question_extracting` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',`question_number` int(11) NOT NULL COMMENT '抽题数',`total_score` int(11) NOT NULL COMMENT '总分(乘以10以后的值)',`obtain_score` int(11) DEFAULT NULL COMMENT '得分(乘以10以后的值)',`user_id` bigint(20) NOT NULL COMMENT '抽取人',`create_time` datetime NOT NULL COMMENT '创建时间',PRIMARY KEY (`id`),KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4981687 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='抽题记录表';

目前我在这个表中保存了 4000 万左右的数句,如下我执行查询语句:

 SELECTtotal_score ,question_number ,create_timeFROMquestion_extractingWHEREuser_id = 760ORDER BYtotal_scoreLIMIT 1000;

你知道这个过程 order by 是怎么操作的吗?

2 MySql 全字段排序

在这个 question_extracting 抽题表中 ,我们为 user_id 添加了普通索引,所在在执行上述这个查询时,会走索引查询,

在上述这个查询,MySql 需要对查询结果进行排序,MySQL 会给每个线程分配一 块内存用于排序,称为 sort_buffer。

对于上述这个查询,它的查询过程如下:

  • 第一步 初始化 sort_buffer 区域 ,确定放入 total_score、question_number 、create_time 字段
  • 第二步 从索引 user_id 中 找到第一个满足 user_id='760’ 条件的主键 id
  • 第三步 回表到主键 id 索引取出整行,取 total_score、question_number 、create_time 三个字段的值,存入 sort_buffer 中
  • 第四步 从索引 user_id 取下一个记录的主键 id
  • 然后重复 第三步 和 第四步 直到 user_id 的值不满足查询条件为止
  • 查询结束后,对 sort_buffer 中的数据按照字段 total_score 做快速排序
  • 最后 按照排序结果取前 1000 行返回给客户端


在上述的这个排序过程,我们可以称为 全字段排序

参数 sort_buffer_size ,MySQL 为排序开辟的内存(sort_buffer)的大小,如果将要排序的数据量小于 sort_buffer_size,排序就在内存中完成;如果排序数据量太大,内存放不下,就需要使用用磁盘临时文件辅助排序,可称为 外部排序

在外部排序中,MySQL 将需要排序的数据分成 N 份,使用参数 number_of_tmp_files 来表示,每一份单独排序后存在这些临时文件中,然后把这 N 个有序文件再合并成一个有序的大文件。

在内存排序中,number_of_tmp_files的值为0,在外部排序中,number_of_tmp_files的值大于0,sort_buffer_size 的值越小,需要排序的数据量就需要分成的份数越多,number_of_tmp_files的值就越大。

3 MySql rowid 排序

MySql rowid 排序应用于 当查询要返回的字段很多的时候,这种情况下,使用全字段排序,如果单行很大,排序的数据量也会很大,排序的性能会很差。

参数 max_length_for_sort_data,在 MySQL 中控制用于排序的行数据的长度,如果单行的长度超过这个值,MySQL的排序算法就会将全字段排序切换为 rowid 排序。

 SELECT*FROMquestion_extractingWHEREuser_id = 760ORDER BYtotal_scoreLIMIT 1000;

如在这个查询中,在rowid 排序中,只有要排序的列 total_score 和主键 id 会放入到 sort_buffer 中,它的查询过程如下:

  • 第一步 初始化 sort_buffer 区域 ,确定放入两个字段 total_score、id字段
  • 第二步 从索引 user_id 中 找到第一个满足 user_id='760’ 条件的主键 id
  • 第三步 回表到主键 id 索引取出整行,取 total_score、id两个字段的值,存入 sort_buffer 中
  • 第四步 从索引 user_id 取下一个记录的主键 id
  • 然后重复 第三步 和 第四步 直到 user_id 的值不满足查询条件为止
  • 查询结束后,对 sort_buffer 中的数据按照字段 total_score 做快速排序
  • 然后从 sort_buffer 中取出 排序好的 id ,依次回表查询获取前 1000行


对比全字段排序与 rowid 排序,rowid 排序要比 全字段排序多一次回表查询操作,所以 对于 InnoDB 表来说,rowid 排序会要求回表多造成磁盘读,因此不会被优先选择。

4 explain 命令

用 explain 命令来查看上述查询语句的执行情况

Extra 这个字段中的“Using filesort”表示的就是需要排序。


完毕

不局限于思维,不局限语言限制,才是编程的最高境界。

以小编的性格,肯定是要录制一套视频的,随后会上传

有兴趣 你可以关注一下 西瓜视频 — 早起的年轻人

MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序相关推荐

  1. 《MySQL——order by逻辑(全字段排序与rowid排序)》

    创建一个表,然后使用查询语句: 查询城市是"杭州"的所有人名字,并且按照姓名排序返回前 1000 个人的姓名.年龄 create table 't' ('id' int(11) n ...

  2. Mysql学习之order by的工作原理

    在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.假设你要查询城市是"杭州"的所有人名字,并且按照姓名排序返回前 1000 个人的姓名.年龄. 查询语句为: ...

  3. mysql中的order by

    一.order by的原理 1.利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 ran ...

  4. mysql union 出错_ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL)...

    ORDER BY子句在MySQL中使用UNION时出错(Error with ORDER BY clause using UNION in MySQL) 我在MySQL中有以下查询: (SELECT ...

  5. Mysql group by,order by,dinstict优化

    1.order by优化 2.group by优化 3.Dinstinct 优化 1.order by优化 实现方式: 1. 根据索引字段排序,利用索引取出的数据已经是排好序的,直接返回给客户端: 2 ...

  6. Mysql优化之Order By/Group By

    1.小表驱动大表 1.小表驱动大表,可以不用建立那么多次链接. in后面用小表 exists后用大表 2.order by关键字排序优化 创建表 create table tblA( #id int ...

  7. java为什么运行不了mysql_运行java程序连接mysql数据库是出现如下结果怎么回事?...

    运行java程序连接mysql数据库是出现如下结果怎么回事? 关注:160  答案:3  mip版 解决时间 2021-01-24 13:56 提问者你若离去丶巴掌扇去 2021-01-24 05:2 ...

  8. mysql自动关闭_服务器mysql数据库老自动停止,请问怎么回事

    展开全部 分析原因一:Mysql的自动备份功能可能导致数据库在备份的时候先关闭服务,而在此启动62616964757a686964616fe4b893e5b19e31333361326333的时候服务 ...

  9. mysql之order by自定义排序规则进行排序(转载)

    1.问题描述 今天接到一个任务按照设备状态进行排序,课中>在线>离线,4是课中,0是在线,1是离线,所以排序规则是4,0,1没有规律,现在要进行排序. 2.上代码 SELECTdetail ...

最新文章

  1. MySQL8——源码安装
  2. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening
  3. MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》
  4. Android屏幕尺寸适配注意事项
  5. Android ORM 框架:GreenDao 数据库升级
  6. ML.NET 1.4 发布,跨平台机器学习框架
  7. 【ArcGIS微课1000例】0023:ArcGIS将地理照片(无人机照片)转为点(航迹)案例教程
  8. java面试题7 牛客:关于AWT和Swing说法正确的是?
  9. jsp内置对象--session
  10. wifi情况下使用fiddler_钢筋网片在什么情况下使用?
  11. 线上解决Resin服务响应过慢的几个方法(转)
  12. php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
  13. 脉聊社交网站源码类似微博的社交源码 模板UI非常漂亮自适应手机版 重点是有原生APP
  14. oppo手机禁止自动打开应用商店
  15. FreeBSD+gnome3详细安装指南
  16. OA项目之我的会议(会议排座送审)
  17. webshell、一句话木马的权限问题
  18. sublime package control 速度很慢_可怜的ACRH17,它的USB3.0速度被华硕压制了!
  19. java旅游管理开题答辩ppt,旅游管理开题报告
  20. python pycharm_pycharm 使用教程

热门文章

  1. 如何评价MSRA视觉组最新提出的Deformable ConvNets V2?
  2. mysql安装数据自定义_mysql数据库自定义怎么安装
  3. 爬虫案例:利用python爬虫关键词批量下载高清大图
  4. AAAI 2021 | 用于旋转目标检测的动态锚框学习策略
  5. 中科院自动化所目标跟踪论文整理!三篇综述、两篇ICCV 2019!
  6. 《Python编程从入门到实践》记录之求模运算符
  7. matlab+awgn和wgn,噪聲強度(噪聲功率) 噪聲方差到底有什么關系? matlab中的awgn函數...
  8. NVIDIA DLI 深度学习培训 | 北京站年后即将开班
  9. 深度学习(二十二)Dropout浅层理解与实现
  10. linux nginx 安装