orderby命令功能(对order by的理解)

:暂无数据 2026-09-20 12:50:01 :0

orderby命令功能(对order by的理解)

大家好,orderby命令功能相信很多的网友都不是很明白,包括对order by的理解也是一样,不过没有关系,接下来就来为大家分享关于orderby命令功能和对order by的理解的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

对order by的理解

前言

日常开发中,我们经常会使用到order by,亲爱的小伙伴,你是否知道order by 的工作原理呢?order by的优化思路是怎样的呢?使用order by有哪些注意的问题呢?本文将跟大家一起来学习,攻克order by~

一个使用order by 的简单例子

假设用一张员工表,表结构如下:

表数据如下:

我们现在有这么一个需求:查询前10个,来自深圳员工的姓名、年龄、城市,并且按照年龄小到大排序。对应的 SQL 语句就可以这么写:

这条语句的逻辑很清楚,但是它的底层执行流程是怎样的呢?

order by 工作原理

explain 执行计划

我们先用Explain关键字查看一下执行计划

我们可以发现,这条SQL使用到了索引,并且也用到排序。那么它是怎么排序的呢?

全字段排序

MySQL 会给每个查询线程分配一块小内存,用于排序的,称为 sort_buffer。什么时候把字段放进去排序呢,其实是通过idx_city索引找到对应的数据,才把数据放进去啦。

我们回顾下索引是怎么找到匹配的数据的,现在先把索引树画出来吧,idx_city索引树如下:

idx_city索引树,叶子节点存储的是主键id。还有一棵id主键聚族索引树,我们再画出聚族索引树图吧:

我们的查询语句是怎么找到匹配数据的呢?先通过idx_city索引树,找到对应的主键id,然后再通过拿到的主键id,搜索id主键索引树,找到对应的行数据。

加上order by之后,整体的执行流程就是:

执行示意图如下:

将查询所需的字段全部读取到sort_buffer中,就是全字段排序。这里面,有些小伙伴可能会有个疑问,把查询的所有字段都放到sort_buffer,而sort_buffer是一块内存来的,如果数据量太大,sort_buffer放不下怎么办呢?

磁盘临时文件辅助排序

实际上,sort_buffer的大小是由一个参数控制的:sort_buffer_size。如果要排序的数据小于sort_buffer_size,排序在sort_buffer 内存中完成,如果要排序的数据大于sort_buffer_size,则借助磁盘文件来进行排序

如何确定是否使用了磁盘文件来进行排序呢?可以使用以下这几个命令

可以从 number_of_tmp_files 中看出,是否使用了临时文件。

number_of_tmp_files 表示使用来排序的磁盘临时文件数。如果number_of_tmp_files》0,则表示使用了磁盘文件来进行排序。

使用了磁盘临时文件,整个排序过程又是怎样的呢?

TPS: 借助磁盘临时小文件排序,实际上使用的是归并排序算法。

小伙伴们可能会有个疑问,既然sort_buffer放不下,就需要用到临时磁盘文件,这会影响排序效率。那为什么还要把排序不相关的字段(name,city)放到sort_buffer中呢?只放排序相关的age字段,它不香吗?可以了解下rowid 排序。

rowid 排序

rowid 排序就是,只把查询SQL需要用于排序的字段和主键id,放到sort_buffer中。那怎么确定走的是全字段排序还是rowid 排序排序呢?

实际上有个参数控制的。这个参数就是max_length_for_sort_data,它表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。我们可以通过命令看下这个参数取值。

max_length_for_sort_data 默认值是1024。因为本文示例中name,age,city长度=64+4+64 =132 《 1024, 所以走的是全字段排序。我们来改下这个参数,改小一点.

使用rowid 排序的话,整个SQL执行流程又是怎样的呢?

执行示意图如下:

对比一下全字段排序的流程,rowid 排序多了一次回表。

什么是回表?拿到主键再回到主键索引查询的过程,就叫做回表”

我们通过optimizer_trace,可以看到是否使用了rowid排序的:

全字段排序与rowid排序对比

一般情况下,对于InnoDB存储引擎,会优先使用全字段排序。可以发现 max_length_for_sort_data 参数设置为1024,这个数比较大的。一般情况下,排序字段不会超过这个值,也就是都会走全字段排序。

order by的一些优化思路

我们如何优化order by语句呢?

联合索引优化

再回顾下示例SQL的查询计划

我们给查询条件city和排序字段age,加个联合索引idx_city_age。再去查看执行计划:

可以发现,加上idx_city_age联合索引,就不需要Using filesort排序了。为什么呢?因为索引本身是有序的,我们可以看下idx_city_age联合索引示意图,如下:

整个SQL执行流程变成酱紫:

流程示意图如下:

从示意图看来,还是有一次回表操作。针对本次示例,有没有更高效的方案呢?有的,可以使用覆盖索引:

覆盖索引:在查询的数据列里面,不需要回表去查,直接从索引列就能取到想要的结果。换句话说,你SQL用到的索引列数据,覆盖了查询结果的列,就算上覆盖索引了。”

我们给city,name,age 组成一个联合索引,即可用到了覆盖索引,这时候SQL执行时,连回表操作都可以省去啦。

调整参数优化

我们还可以通过调整参数,去优化order by的执行。比如可以调整sort_buffer_size的值。因为sort_buffer值太小,数据量大的话,会借助磁盘临时文件排序。如果MySQL服务器配置高的话,可以使用稍微调整大点。

我们还可以调整max_length_for_sort_data的值,这个值太小的话,order by会走rowid排序,会回表,降低查询性能。所以max_length_for_sort_data可以适当大一点。

当然,很多时候,这些MySQL参数值,我们直接采用默认值就可以了。

使用order by 的一些注意点:没有where条件,order by字段需要加索引吗

日常开发过程中,我们可能会遇到没有where条件的order by,那么,这时候order by后面的字段是否需要加索引呢。如有这么一个SQL,create_time是否需要加索引:

无条件查询的话,即使create_time上有索引,也不会使用到。因为MySQL优化器认为走普通二级索引,再去回表成本比全表扫描排序更高。所以选择走全表扫描,然后根据全字段排序或者rowid排序来进行。

如果查询SQL修改一下:

分页limit过大时,会导致大量排序怎么办?

假设SQL如下:

索引存储顺序与order by不一致,如何优化?

假设有联合索引 idx_age_name, 我们需求修改为这样:查询前10个员工的姓名、年龄,并且按照年龄小到大排序,如果年龄相同,则按姓名降序排。对应的 SQL 语句就可以这么写:

我们看下执行计划,发现使用到Using filesort

这是因为,idx_age_name索引树中,age从小到大排序,如果age相同,再按name从小到大排序。而order by 中,是按age从小到大排序,如果age相同,再按name从大到小排序。也就是说,索引存储顺序与order by不一致。

我们怎么优化呢?如果MySQL是8.0版本,支持Descending Indexes,可以这样修改索引:

使用了in条件多个属性时,SQL执行是否有排序过程

如果我们有联合索引idx_city_name,执行这个SQL的话,是不会走排序过程的,如下:

但是,如果使用in条件,并且有多个条件时,就会有排序过程。

这是因为:in有两个条件,在满足深圳时,age是排好序的,但是把满足上海的age也加进来,就不能保证满足所有的age都是排好序的。因此需要Using filesort。

order by是什么意思

order by 是排序的意思。order by 列名1,列名2,..... 你按照什么排序就写什么列。 如果列名后什么都不写,也可以写ASC,表示升序排列,如果要想降序排列,在列名后面写desc 。

order by是什么意思

order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数。
where条件用于group by之前,having用于group by 之后对结果进行筛选。

order用法

一、名词order:
1、作“顺序”、“次序”。常用短语:in order of 按顺序。如:
A list of some of the common metals in the order of their activity is given below. 下面列出了某些金属按其活泼顺序排列的一个表格.
2、作“秩序”。常用短语:keep ... in order 使......有序。如:
The machine is in good working order. 机器运转良好.
Our laboratory is kept in good order. 我们的实验室保持整齐.(句中in good order为主语补语.)
3、作“指示、命令”。常用短语:give sb. anorderto do sth.命令某人做某事。如:
He gave orders for the work to be started. (=…orders that the work should be started.)他下令开始工作.
4、点菜;所点的饮食菜肴。
二、动词order:
1、作”命令”。常用短语:ordersb.to do sth. 令某人做某事。如:
The doctor ordered him to stay there.医生嘱咐他留在那里。(不定式短语to stay there作宾语补语)
2、作“点餐、“订购”。常用短语:ordersth.for sb./ordersb.for sth.为某人订购/点某物。如:
They have ordered 1,000 oil pumps from our factory.他们已向我厂订购1,000台油泵。

来源:网络。本文版权归原创作者所以。

sql中order by和group by的区别

1、意思不一样。

order by 是指从英文里理解就是行的排序方式,默认的为升序。后面必须列出排序的字段名,可以是多个字段名。

group by 是指从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。 

2、适用范围不同:order by 用于排序,一般与asc升序或desc降序一起使用。例如select * from 表A order by 列a。

group by 用于分类汇总,一般与聚合函数(比如avg平均、sum合计、max最大、min最小、count计算行)一起使用。例如select 月份,sum(工资)as 总工资 from 工资表 group by 月份。

3、定义不同:order by主要侧重许多数据的排序,例如按照大小顺序对数据进行排列,group by主要侧重许多数据的分组,例如按照性别、年龄、国家、学科等进行分组。

4、使用的函数不一样。

order by子句中的列必须包含在聚合函数或 GROUP BY 子句中。

group by 子句中可使用的函数AVG()  、MIN() 、 MAX()  、SUM() 、COUNT() 。

5、order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。

group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。

扩展资料

Microsoft Jet 数据库引擎 SQL 数据类型 由13个基本数据类型组成,它们是由 Microsoft Jet 数据库引擎和几个验证过的有效同义字定义的。常见的有:整形,单精度,双精度,可变长度字符,固定长度字符,长型,日期等等。

可以用ALTER TABLE 语句修正基数和增量。刚插进表中的行会有自动为基于新种值和增量值的列生成的值。如果新种和增长的值和以前的种值及增量匹配,就会造成复制。如果这个列是主键,复制值生成时可能导致错误。

定义成TEXT也称作MEMO)或CHAR(也称作有具体长度的 TEXT(n))的字段中的字符被储存在 Unicode 表示格式。

Unicode字符一律需要两个字节存储每一字符。对于现有的主要包含字符数据的 Microsoft Jet数据库,这可能意味着数据库文件被转换成 Microsoft Jet 4.0格式时字长会增加将近一倍。

然而,从前由单字节字符群(SBCS)指示的众多字符群的Unicode 表示可以很容易地被压缩成一个单字节。有关的详细信息,参见CREATE TABLE。如果用COMPRESSION属性定义CHAR列,数据存储时会自动被压缩,提取时解压缩。

关于本次orderby命令功能和对order by的理解的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

orderby命令功能(对order by的理解)

本文编辑:admin

本文相关文章:


word2003目录怎么做(word2003如何自动生成目录)

word2003目录怎么做(word2003如何自动生成目录)

各位老铁们,大家好,今天由我来为大家分享word2003目录怎么做,以及word2003如何自动生成目录的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年10月10日 20:50

word页码从任意页开始(word中如何设置页码从指定页开始)

word页码从任意页开始(word中如何设置页码从指定页开始)

其实word页码从任意页开始的问题并不复杂,但是又很多的朋友都不太了解word中如何设置页码从指定页开始,因此呢,今天小编就来为大家分享word页码从任意页开始的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月1日 05:30

microsoft word打印在哪里(word打印在哪里)

microsoft word打印在哪里(word打印在哪里)

本篇文章给大家谈谈microsoft word打印在哪里,以及word打印在哪里对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年8月30日 00:00

免费的u盘修复工具(u盘数据恢复 for mac版,相信我,这款免费工具你会爱不释手的)

免费的u盘修复工具(u盘数据恢复 for mac版,相信我,这款免费工具你会爱不释手的)

“免费的u盘修复工具”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看免费的u盘修复工具(u盘数据恢复 for mac版,相信我,这款免费工具你会爱不释手的)!

2026年8月6日 23:40

macromedia fireworks8序列号(Macromedia Fireworks 8序列号)

macromedia fireworks8序列号(Macromedia Fireworks 8序列号)

“macromedia fireworks8序列号”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看macromedia fireworks8序列号(Macromedia Fireworks 8序列号)!

2026年7月23日 14:20

commandline parse error(command line option syntax error.type cammand/for help.是什么意思)

commandline parse error(command line option syntax error.type cammand/for help.是什么意思)

今天给各位分享command line option syntax error.type cammand/for help.是什么意思的知识,其中也会对command line option syntax error.type camman

2026年10月7日 21:50

undergraduate degree(bachelor和undergraduate有什么区别么)

undergraduate degree(bachelor和undergraduate有什么区别么)

这篇文章给大家聊聊关于undergraduate degree,以及bachelor和undergraduate有什么区别么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月3日 13:00

scanf为什么不安全(warning C4996: ’scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To)

scanf为什么不安全(warning C4996: ’scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To)

本篇文章给大家谈谈scanf为什么不安全,以及warning C4996: ’scanf’: This function or variable may be unsafe. Consider using scanf_s instead.

2026年9月27日 03:40

wordpress好用的插件(wordpress pdf插件哪个好用)

wordpress好用的插件(wordpress pdf插件哪个好用)

大家好,关于wordpress好用的插件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于wordpress pdf插件哪个好用的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对

2026年9月24日 12:50

fedora36(fedora36切换启动界面)

fedora36(fedora36切换启动界面)

各位老铁们好,相信很多人对fedora36都不是特别的了解,因此呢,今天就来为大家分享下关于fedora36以及fedora36切换启动界面的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年9月10日 14:00

更多文章:


mariadb忘记密码(mysql用户密码忘记了怎么办)

mariadb忘记密码(mysql用户密码忘记了怎么办)

大家好,mariadb忘记密码相信很多的网友都不是很明白,包括mysql用户密码忘记了怎么办也是一样,不过没有关系,接下来就来为大家分享关于mariadb忘记密码和mysql用户密码忘记了怎么办的一些知识点,大家可以关注收藏,免得下次来找不

2026年10月15日 07:50

mysql端口号(如何查看自己数据库的端口号)

mysql端口号(如何查看自己数据库的端口号)

“mysql端口号”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看mysql端口号(如何查看自己数据库的端口号)!

2026年10月15日 06:30

printf打印16进制(C语言 十六进制怎么输出)

printf打印16进制(C语言 十六进制怎么输出)

大家好,今天小编来为大家解答以下的问题,关于printf打印16进制,C语言 十六进制怎么输出这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 06:00

avantage怎么设置为中文(Avantage安装丢失GIT)

avantage怎么设置为中文(Avantage安装丢失GIT)

大家好,如果您还对avantage怎么设置为中文不太了解,没有关系,今天就由本站为大家分享avantage怎么设置为中文的知识,包括Avantage安装丢失GIT的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月15日 03:00

ospf协议的作用是什么(OSPF路由协议的作用是什么)

ospf协议的作用是什么(OSPF路由协议的作用是什么)

“ospf协议的作用是什么”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看ospf协议的作用是什么(OSPF路由协议的作用是什么)!

2026年10月15日 02:40

方案对比特效js(在一个网页中如何实现两个JS特效)

方案对比特效js(在一个网页中如何实现两个JS特效)

各位老铁们好,相信很多人对方案对比特效js都不是特别的了解,因此呢,今天就来为大家分享下关于方案对比特效js以及在一个网页中如何实现两个JS特效的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 02:10

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

今天给各位分享登陆视频监控网页时提示activex控件未注册,怎么解决的知识,其中也会对登陆视频监控网页时提示activex控件未注册,怎么解决进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:30

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

今天给各位分享用C语言编程学生信息管理系统!的知识,其中也会对用C语言编程学生信息管理系统!进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:20

excel连接sql数据库教程(excel怎么连接sql数据库)

excel连接sql数据库教程(excel怎么连接sql数据库)

本篇文章给大家谈谈excel连接sql数据库教程,以及excel怎么连接sql数据库对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月14日 19:40

null s brawl(null和空字符有区别吗)

null s brawl(null和空字符有区别吗)

今天给各位分享null和空字符有区别吗的知识,其中也会对null和空字符有区别吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 19:00

最近更新

可信验证系统(什么是可信云认证)
2026-10-15 10:00:23 浏览:0
广告推广app(常见的app推广方式)
2026-10-15 09:20:01 浏览:0
热刺vs马赛比赛(热刺赛程比分)
2026-10-15 09:10:01 浏览:0
热门文章

标签列表