MySQL order by的不同排序规则
explain语句执行的结果中,Extra项中含有
Using filesort
表示需要排序,MySQL
会给每个线程分配一块内存用于排序,称为sort_buffer。
全字段排序
全字段排序在内存中进行,不涉及磁盘IO、不需要回表操作,但数据量受内存大小影响,有局限性。
语句执行流程:
- 初始化sort_buffer,将需要查询的字段放入sort_buffer。
- 逐行或从索引中找到满足where条件的主键id。
- 将主键id索引取出整行,取查询出的字段值放入sort_buffer。
- 取下一个满足where条件的主键id。
- 重复步骤3、4,直到不满足where条件。
- 对sort_buffer中的数据按order by条件快速排序。
- 按照排序结果取数据返回。
rowid排序
rowid排序涉及磁盘IO,需要一次回表操作,不受内存大小限制。
当排序的字段较多时,内存可放下的行数很少,需要分成很多个临时文件,排序性能很差,即MySQL认为排序的单行长度太大会使用rowid排序。
语句执行流程:
- 初始化sort_buffer,将需要查询的字段放入sort_buffer。
- 逐行或从索引中找到满足where条件的主键id。
- 到主键id索引中取出整行,将查询的字段数据放入sort_buffer中。
- 取出下一个记录的主键id。
- 重复步骤3、4直到不满足where条件为止。
- 对sort_buffer中的数据按order by的条件进行排序。
- 遍历排序结果,取数据返回。
控制用于排序的行数据的长度,单行长度超过该值,MySQL更换排序算法 SET max_length_for_sort_data = 16;
使用索引排序
语句执行流程:
- 从索引找到第一个满足where条件的主键id
- 到主键id索引取出整行,找出需要返回的字段,作为结果集直接返回
- 从索引取下一个记录主键的id
- 重复步骤2、3,直到不满足where条件时循环结束。
当索引上的字段信息满足查询的结果集时(即覆盖索引),则不需要再回到主键索引上取数据。步骤2就变成了从索引上取出数据,作为结果集直接返回,节省一步回表操作。
使用覆盖索引时,explain
语句的Extra
字段会多了个"Using index",表示使用索引覆盖。
MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。
MySQL order by的不同排序规则相关推荐
- mysql排序规则_MySQL中Order By多字段排序规则代码示例
说在前面 突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧. MySql order by 单字段 建一测试表如下: CREATE TABLE ...
- c++ sort 从大到小排序_算法的艺术:MySQL order by对各种排序算法的巧用
在 [精华]洞悉MySQL底层架构:游走在缓冲与磁盘之间 这篇文章中,我们介绍了索引树的页面怎么加载到内存中,如何淘汰,等底层细节.这篇文章我们从比较宏观的角度来看MySQL中关键字的原理.本文,我们 ...
- MySQL学习笔记3:排序规则和排序规则的影响
一.排序规则概念 在mysql数据库中,排序规则是依赖字符集编码的,他们在mysql中经常是捆绑的存在. 排序规则一般指对字符集中字符串之间的比较.排序制定的规则.一种字符集可以对应多种排序规则,但是 ...
- Mysql 创建数据库字符集与排序规则
一.utf8 和 utf8mb4 区别 新版本数据库默认编码格式是 utf8mb4,utf8mb4 比 utf8 多了 emoji 编码支持,建议普通表使用 utf8 如果这个表需要支持 emoji ...
- MySQL学习笔记4:排序规则的修改
数据库的字符集和排序规则优先级:字段级别>表级别>schema级别>服务器级别(实例级别),如果没有设置字段级别的字符集和排序规则,那么默认就取表的,如果表上也没有设置那就默认取sc ...
- mysql新建数据库字符集与排序规则的选择
目录 字符集选择 排序规则 字符集选择 一般选择utf8.下面介绍一下utf8与utfmb4的区别. utf8mb4兼容utf8,且比utf8能表示更多的字符.至于什么时候用,看你的做什么项目了,到 ...
- mysql order by 多字段排序
工作中需用到order by 后两个字段排序,但结果却产生了一个Bug,以此备录. [1]复现问题场景 为了说明问题,模拟示例数据库表students,效果同实例. 如下语句Sql_1: 1 SELE ...
- MySQL ORDER BY IF() 条件排序
在做sqlzoo的时候,碰到一个SQL的排序问题,他把符合条件的单独几行,可以放在查询结果的开始,或者查询结果的尾部 通过的方法就是IN语句(也可以通过IF语句) 自己做了个测试,如下,这个是表的所有 ...
- MySQL ORDER BY 使用自定义排序顺序
ORDER BY 子句可以使用FIELD() 函数为列中的值定义自定义的排序顺序. 例如下表: +----------------+ | orders | +----------------+ | o ...
最新文章
- Awcing算法--双指针
- keras 的 example 文件 mnist_swwae.py 解析
- Linux之查找文件命令
- c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
- 奖学金pascal程序
- 为什么监听不到开机广播action.BOOT_COMPLETED
- python 共享内存变量_浅谈python多进程共享变量Value的使用tips
- H3 BPM MVC表单SheetOffice控件使用分享
- 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。...
- go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码
- js 判断各种数据类型
- 在linux 或docker中使用 system.drawing.common
- 终于给cs来了一次小整容
- 绿盾加密如何顺利切换成IP-Guard加密
- Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
- 六度分离(floyd)
- echart旭日图_基于Echarts4.0实现旭日图
- redis安装和启动
- 反射望远镜的发展历程(4)
- clamav Java_ClamAV安装使用详解