MySQL会为每个线程分配一个内存(sort_buffer)用于排序,该内存小大为 sort_buffer_size

如果排序的数量小于 sort_buffer_size,排序将会在内存中完成。

如果排序数据量很大,内存中无法存下这么多数据,则会使用磁盘临时文件来辅助排序,也称外部排序

在使用外部排序时,MySQL 会分成好几份单独的临时文件用来存放排序后的数据,然后再将这些文件合并成一个大文件

MySQL 会通过遍历索引将满足条件的数据读到 sort_buffer,并且按照排序字段进行快速排序

如果查询的字段不包含在辅助索引中,需要按照辅助索引记录的主键返回聚集索引所需字段。

该方式会造成随机 IO,在MySQL 5.6提供了 MRR 机制,会将副主索引匹配记录的主键取出来再内存中进行排序,然后再回表

按照情况建立联合索引来避免排序锁带来的性能损耗,允许的情况下也可以建立覆盖索引来避免回表。

全字段排序

通过索引将所需的字段全部读取到 sort_buffer 中

按照排序字段进行排序

将结果返回给客户端

缺点:

造成sort_buffer 中存放不下很多数据,因为除了排序字段还存放其他字段,对 sort_buffer 的利用效率不高

当所需排序数据量很大时,会有很多的临时文件,排序性能也会很差

优点: MySQL 认为内存足够大时会优先选择全字段排序,因为这种方式比 row_id排序避免了一次回表操作

rowid 排序

通过控制排序的行数据的长度来让 sort_buffer 中尽可能多地存放数据,max_length_for_sort_data

只将需要排序的字段和主键读到 sort_buffer 中,并按照排序字段进行排序

按照排序后的顺序,取id 进行回表取出想要获取的数据

将结果集返回给客户端

优点:更好地利用内存的 sort_buffer 进行排序操作,尽量减少对磁盘的访问

缺点:回表的操作时随机 IO,会造成大量的随机读,不一定就比全字段排序减少对磁盘的访问

按照排序的结果返回客户端所取行数

随机取出三行数据的需求

order by rand() 这个语句需要 Using temporary 和 Using filesort,查询的执行代价比较大

使用表的主键 id 的最大值和最小值来做随机算法。

这种方法如果在 id 有空洞的情况下,就不是真正的随机。代价比 1 小很多,因为只使用了 id 字段,没有像1 一样,需要在 order by rand() 方法组成的临时表排序,再获取 rowid 再回表。如果数据库使用了软删除,就可以避免空洞的情况,减少扫描行数。

取出整个表的行数C,随机获取三个随机值y1,y2,y3,limit y,1 得到三个数据。扫描行数 是 总行数c+(y1+1)+(y2+1)+(y3+1)

可以进一步优化:limit Ymin, (Ymax-Ymin), 取出id 后计算出 Y1,Y2,Y3对应的 id ,然后 select in ids,扫描行数减少为 C + ymax +3.

在实际的应用中,应该避免让 mysql 来排序,尽量将业务逻辑写在业务代码中,让数据库只做 “读写数据” 的事情。

mysql orderby多个_MySQL OrderBy相关推荐

  1. mysql 数据库访问层_MYSQL数据库访问层

    /** * 数据访问层,仅处理MYSQL * 包括 * by:李勇 * at:2009-01-19 */final classDalSplite{ public function__construct ...

  2. centos得mysql安装教程_Centos下Mysql安装图文教程_MySQL

    Mysql是比较常用的数据库,日常开发中也是采用地比较多.工欲善其事必先利其器,本文特地来讲解下如何在centos(其他linux发行版类似)下安装Mysql.首先准备的材料:Mysql,我这里采用的 ...

  3. mysql怎么跑代码_MySQL菜鸟入门指南_mysql

    mysql是完全网络化的跨平台关系型数据库系统,一个真正的多用户.多线程SQL数据库服务器,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具有功能强.使用简便.管理方便.容易使用.运行速度 ...

  4. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  5. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

  6. MySQL语言的算法_MySQL知识整理

    写在前面的话:秋招来临,博主对MySQL知识进行了整理,全文包括数据库优化和数据库基础两部分 数据库优化 1.优化的目的 [1]     避免页面访问的出错(5xx错误:慢查询无法加载:阻塞无法提交) ...

  7. MySQL数据库的终结_MySQL数据库秘籍终结 对不起了 让你们自宫了 其实不消哈哈哈...

    PHP操作MySQL的步调 其实作为一个开发者,有一个良好的学习空气很重要,这是我的一个php交流群535686202,年夜家 可以加入,非论是年夜牛还是小白,一起交流成长!! 第一步:PHP连接My ...

  8. mysql的原理图解_MySQL排序工作原理

    在程序设计当中,我们很多场景下都会用 group by 关键字.比如在分页读取数据时,为了避免重复扫描记录,这就是必须要使用 group by 了. 比如我们使用如下 DDL 创建表: CREATET ...

  9. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

最新文章

  1. 通过HTTP协议上传文件
  2. python数据分析第三方库是_python数据分析复盘——数据分析相关库之Pandas
  3. 星尘小组第八周翻译-数据页和数据行
  4. 80行JavaScript代码实现的贪食蛇游戏,简约之美
  5. 【转】介绍设置Session失效的几种方法
  6. 一个显示器分两个屏幕_桌面改造计划2.0:一个显示器不够那就两个,桌面好物分享...
  7. “编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
  8. python--getitme\setitem 支持索引与分片
  9. 好东西再安利一遍!!
  10. Ubuntu20.04禁用触摸屏键盘
  11. 0006 -求三个数的平均数
  12. Linux下获取外网IP地址的方法
  13. mysql 临时表联表查询_一、MySQL中使用从表A中取出数据来更新表B的内容例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin。SQL语言中不...
  14. web大作业介绍自己的家乡_【天成好作文】胡缤云 二十年后的家乡
  15. 【DP SDOI2008 BZOJ 2037】Sue的小球
  16. 程序员如何保护自己的颈椎?颈椎操
  17. windows下装ipython
  18. 转:经典Excel VBA代码
  19. 2023年如何成为一名优秀的大前端Leader?
  20. Salesforce为何玩不转新东方?教育需自己的垂直SaaS

热门文章

  1. python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃
  2. 应用程序添加到服务器,在同一应用程序中的配置服务器和eureka服务器:尝试连接到localhost:8761...
  3. 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
  4. 让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化
  5. java访问类的方法_Java:如何从另一个类访问方法
  6. 福州PHP讲师招聘_“艺”起就业|招聘信息汇总
  7. php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?
  8. python变量持久化_Python 数据持久化:JSON
  9. Java实现C语言select函数_一道面试题目,分别用sql 和java,c++, c语言实现,
  10. php接收get数组数据,来自HTTP的PHP注入GET数据用作PHP数组键值