explain语句执行的结果中,Extra项中含有Using filesort表示需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。

全字段排序

全字段排序在内存中进行,不涉及磁盘IO、不需要回表操作,但数据量受内存大小影响,有局限性。
语句执行流程:

  1. 初始化sort_buffer,将需要查询的字段放入sort_buffer。
  2. 逐行或从索引中找到满足where条件的主键id。
  3. 将主键id索引取出整行,取查询出的字段值放入sort_buffer。
  4. 取下一个满足where条件的主键id。
  5. 重复步骤3、4,直到不满足where条件。
  6. 对sort_buffer中的数据按order by条件快速排序。
  7. 按照排序结果取数据返回。

rowid排序

rowid排序涉及磁盘IO,需要一次回表操作,不受内存大小限制。
当排序的字段较多时,内存可放下的行数很少,需要分成很多个临时文件,排序性能很差,即MySQL认为排序的单行长度太大会使用rowid排序。
语句执行流程:

  1. 初始化sort_buffer,将需要查询的字段放入sort_buffer。
  2. 逐行或从索引中找到满足where条件的主键id。
  3. 到主键id索引中取出整行,将查询的字段数据放入sort_buffer中。
  4. 取出下一个记录的主键id。
  5. 重复步骤3、4直到不满足where条件为止。
  6. 对sort_buffer中的数据按order by的条件进行排序。
  7. 遍历排序结果,取数据返回。

控制用于排序的行数据的长度,单行长度超过该值,MySQL更换排序算法 SET max_length_for_sort_data = 16;

使用索引排序

语句执行流程:

  1. 从索引找到第一个满足where条件的主键id
  2. 到主键id索引取出整行,找出需要返回的字段,作为结果集直接返回
  3. 从索引取下一个记录主键的id
  4. 重复步骤2、3,直到不满足where条件时循环结束。

当索引上的字段信息满足查询的结果集时(即覆盖索引),则不需要再回到主键索引上取数据。步骤2就变成了从索引上取出数据,作为结果集直接返回,节省一步回表操作。

使用覆盖索引时,explain语句的Extra字段会多了个"Using index",表示使用索引覆盖。

MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。

MySQL order by的不同排序规则相关推荐

  1. mysql排序规则_MySQL中Order By多字段排序规则代码示例

    说在前面 突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧. MySql order by 单字段 建一测试表如下: CREATE TABLE ...

  2. c++ sort 从大到小排序_算法的艺术:MySQL order by对各种排序算法的巧用

    在 [精华]洞悉MySQL底层架构:游走在缓冲与磁盘之间 这篇文章中,我们介绍了索引树的页面怎么加载到内存中,如何淘汰,等底层细节.这篇文章我们从比较宏观的角度来看MySQL中关键字的原理.本文,我们 ...

  3. MySQL学习笔记3:排序规则和排序规则的影响

    一.排序规则概念 在mysql数据库中,排序规则是依赖字符集编码的,他们在mysql中经常是捆绑的存在. 排序规则一般指对字符集中字符串之间的比较.排序制定的规则.一种字符集可以对应多种排序规则,但是 ...

  4. Mysql 创建数据库字符集与排序规则

    一.utf8 和 utf8mb4 区别 新版本数据库默认编码格式是 utf8mb4,utf8mb4 比 utf8 多了 emoji 编码支持,建议普通表使用 utf8 如果这个表需要支持 emoji  ...

  5. MySQL学习笔记4:排序规则的修改

    数据库的字符集和排序规则优先级:字段级别>表级别>schema级别>服务器级别(实例级别),如果没有设置字段级别的字符集和排序规则,那么默认就取表的,如果表上也没有设置那就默认取sc ...

  6. mysql新建数据库字符集与排序规则的选择

    目录 字符集选择 排序规则 字符集选择 一般选择utf8.下面介绍一下utf8与utfmb4的区别. utf8mb4兼容utf8,且比utf8能表示更多的字符.至于什么时候用,看你的做什么项目了,到 ...

  7. mysql order by 多字段排序

    工作中需用到order by 后两个字段排序,但结果却产生了一个Bug,以此备录. [1]复现问题场景 为了说明问题,模拟示例数据库表students,效果同实例. 如下语句Sql_1: 1 SELE ...

  8. MySQL ORDER BY IF() 条件排序

    在做sqlzoo的时候,碰到一个SQL的排序问题,他把符合条件的单独几行,可以放在查询结果的开始,或者查询结果的尾部 通过的方法就是IN语句(也可以通过IF语句) 自己做了个测试,如下,这个是表的所有 ...

  9. MySQL ORDER BY 使用自定义排序顺序

    ORDER BY 子句可以使用FIELD() 函数为列中的值定义自定义的排序顺序. 例如下表: +----------------+ | orders | +----------------+ | o ...

最新文章

  1. Awcing算法--双指针
  2. keras 的 example 文件 mnist_swwae.py 解析
  3. Linux之查找文件命令
  4. c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
  5. 奖学金pascal程序
  6. 为什么监听不到开机广播action.BOOT_COMPLETED
  7. python 共享内存变量_浅谈python多进程共享变量Value的使用tips
  8. H3 BPM MVC表单SheetOffice控件使用分享
  9. 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。...
  10. go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码
  11. js 判断各种数据类型
  12. 在linux 或docker中使用 system.drawing.common
  13. 终于给cs来了一次小整容
  14. 绿盾加密如何顺利切换成IP-Guard加密
  15. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
  16. 六度分离(floyd)
  17. echart旭日图_基于Echarts4.0实现旭日图
  18. redis安装和启动
  19. 反射望远镜的发展历程(4)
  20. clamav Java_ClamAV安装使用详解

热门文章

  1. Java实现单向链表基本功能
  2. 跳舞(shuffle) 时限:1s 空间:256m
  3. python里面的爬虫爬取网页
  4. 一步一步构建手机WebApp开发——环境搭建
  5. ARMv8/GICv3中断路由
  6. CapstoneCS5262设计DP转HDMI4K60Hz+VGA1080P转换电路|DP to hdmi+vga转换器方案设计方法|CS5262Demoboard参考电路
  7. Weston 窗口管理(2)
  8. linux操作mysql数据库
  9. 卡尔曼滤波器、扩展卡尔曼滤波器、无向卡尔曼滤波器的详细推导
  10. 第七章:OCP工具简介