介绍下MySQL中的order by语句。

几种order by的情况

从最简单的case开始看起。

用这个表来说明:(10w行数据)

1、  最简单的order ―― order by索引字段

从explain的结果来看(Extra列),这个语句并不作排序。因为字段a已经是有顺序的。就是按照索引a的顺序依次读pk的值(在这里是隐藏的系统列),一个个从聚簇索引的data中读入。

2、  复杂一点 ―― order by 非索引字段

这里Extra列显示一个Using filesort。这里的filesort并不是指字面上的“文件排序”,说的就是与上面一种情况相比,在Server层作了排序。至于是否使用文件,取决于排序过程中的内存是否足够,不够则需要临时文件。

server层要怎么作排序呢?

一个简单的想法是把表数据都读到内存,然后排序。读到内存当然可以想怎么整就怎么整。但是这个做法很耗费内存。需要占用与表一样大小的内存。

另外一个做法,只读入字段b和其对应的主键id。可以想象为这两个字段构成的结构体,按照b的值作排序。排序完成后,按字段b的顺序依次取主键id,取得结果返回。

实际上第二种作法就是这个例子中的实际执行过程。存放用于排序的字段值的结构我们成为sort_keys.

至于order by b,c这样的语句,效果与order by b相同,可以简单理解为上面结构体多了一个字段。

3、  字段函数排序

还是按顺序读入所有的字段b,只是sort_keys中存的是b的长度而已。

4、  Order by rand()

按照自然想法, order by rand() 也可以仿照上面描述的做法,对于每一行,将生成的rand()的值放入sort_kyes里即可。但实际上上效果如下:

Extra字段里面有一个Using temporary, 也就是说用到了临时表。那么Using temporary的时候操作流程是怎样的呢?

a)       创建一个heap引擎的临时表,字段名为 ”” a b c d, 第一个字段为匿名;

b)       将表tb中的数据按行读入到临时表中,同时给第一字段填入一个随机实数(0,1);

c)       按照第一个字段排序,返回

d)       查询完成删除临时表

分析一下这个过程,由于把数据从InnoDB表里面读入临时表,则InnoDB表实际上也已经读入内存,在这个过程中,若不考虑内存不够时的写文件策略, 则内存中有两份表的全拷贝;另外多了从内存中将数据一一拷贝到临时表的过程。

这个查询在测试环境中耗时2.41s(多次次执行,不计第一次加载数据的时间)

order by rand()的改进

实际上对于这种简单的order by rand() 的情况,也可以等同于按照非索引字段来处理。在sort_array 中存入随机值即可。

按照这个思路的patch在这里,效果上

说明:执行时间减少为1.89s,性能提升21%, 这个例子单行1k,单行越大提升效果越好。

mysql order by rand 优化_mysql order by与by rand() 的优化经验相关推荐

  1. mysql 导入导出 优化_mysql数据导入导出与数据表优化

    一.数据导入 mysqlimport -uroot oa d:/aa.txt --fields-terminated-by=, --fields-optionally-enclosed-by= --l ...

  2. MySQL多字段排序乱_Mysql ORDER BY 中文排序错乱问题

    1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决,那么MySQL ...

  3. mysql 大量数据 更改索引_Mysql索引数据结构详解与索引优化

    本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可. 一.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若 ...

  4. mysql+索引优化+查询优化+存储优化_mysql利用覆盖索引避免回表优化查询

    前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...

  5. mysql的高阶用法_MySQL的经典用法(十四)-高级优化

    mysql的经典用法(十四)----高级优化 基于 /application/search/mysql/mysql-5.5.28/support-files/my-innodb-heavy-4G.cn ...

  6. mysql禁止自动优化_MySQL必须调整的10项配置优化

    即使是经验老道的人也会犯错,会引起很多麻烦.所以在盲目的运用这些推荐之前,请记住下面的内容: 一次只改变一个设置!这是测试改变是否有益的唯一方法. 大多数配置能在运行时使用SET GLOBAL改变.这 ...

  7. mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  8. discuz mysql 优化_MySQL针对Discuz论坛程序的基本优化教程

    过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕 ...

  9. mysql 优化代码_MySQL Order by 语句优化代码详解

    Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考 MySQL Order By keyword是用来给 ...

最新文章

  1. QN8027性能调试
  2. Java Review - Queue和Stack 源码解读
  3. JAVA基础知识(1)
  4. android分辨率对应关系,android各dpi与分辨率的对应关系
  5. python实现多线程的三种方法threading.Thread(模块)的继承实现和函数实现;以及concurrent.futures模块的线程池实现
  6. java 多线程 临界区_多线程编程的设计模式 临界区模式
  7. 直播行业运维关注的流程图
  8. win7系统office向程序发送命令时出现错误
  9. 原创|批处理实现安卓设备自动重启压力测试(自动生成日志和计算重启时间)
  10. ABIDE数据集预处理项目
  11. 华硕主板无盘启动bios设置_华硕主板怎么进入bios?华硕主板进入bios设置u盘启动方法...
  12. Python---第8天---字符串
  13. Cisco 3650交换机断电后配置无法保存
  14. 做淘宝优惠券怎么线上引流?淘宝客优惠券如何引流?
  15. 【自动驾驶】基于面部Fatigue检测的技术报告
  16. 土圭垚㙓数学课(二)视锥体八个顶点的计算方法
  17. 会声会影实操项目流程
  18. 蒙氏数学素材---乘法板及作业纸
  19. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术
  20. 程序设计思维 B - 猫猫向前冲(拓扑排序、Kahn算法)

热门文章

  1. Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据
  2. EasyExcel入门使用
  3. win7系统安装信息服务器不可用怎么办,Win7系统下iis服务器应用程序不可用怎么办?...
  4. html和css如何制作小球,[网页设计]使用CSS3动画模拟实现小球自由落体效果
  5. hssfworkbook.write 生成文件 数据丢失_电脑文件丢失了,数据恢复我只用这一个软件!...
  6. php 生成dbf,php 读取vfp 8.0,9.0所产生的dbf文件
  7. 失效日期 软件测试案例_软件异常测试
  8. Win11系统怎样设置更改密码
  9. RTSP播放器开发填坑之道
  10. Android同屏或摄像头RTMP推送常用的数据接口设计探讨