数据库的order by什么意思(对order by的理解)

2026-05-15 20:45:01 0

数据库的order by什么意思(对order by的理解)

大家好,关于数据库的order by什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于对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。

sql order by什么意思

sql 里的 order by 和 group by 的区别:

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

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

什么是“聚合函数”?

像sum()、count()、avg()等都是“聚合函数”

使用group by 的目的就是要将数据分类汇总。

一般如:

select 单位名称,count(职工id),sum(职工工资) form group by 单位名称

这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。

在sql命令格式使用的先后顺序上,group by 先于 order by。
order by 排序查询、asc升序、desc降序
示例:
select * from 学生表 order by 年龄 查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示
也可以多条件排序、 比如 order by 年龄,成绩 desc 按年龄升序排列后、再按成绩降序排列

group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。
示例:
select 学号,SUM(成绩) from 选课表 group by 学号 按学号分组、查询每个学号的总成绩

select 学号,AVG(成绩) from 选课表
group by 学号
having AVG(成绩)》(select AVG(成绩) from 选课表 where 课程号=’001’)
order by AVG(成绩) desc
查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列

MySQL 中ORDER BY 1,2是什么意思

  • sql语句中order by就是排序用的,你检查是否有字段别名叫1和2,如果没有,那么就没有意义

  • order by 1,2 的含义是对表的第一列 按照从小到大的顺序进行排列
    然后再对第二列按照从小到大的顺序进行排列
    order by 1,2 等同于 order by

order by什么意思

order by
排序依据; 顺序; 字段名; 降序排列; 记录排序;
All the other ingredients, including water, have to be listed in descendingorder by weight.
所有其他原料,包括水在内,都需要根据重量依次降序排列。

SQL数据库中查询语句Order By和Group By有什么区别

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

group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
一般情况下,group by 需要和聚合函数配合使用。
可以参考下这篇文章
***隐藏网址***
希望能帮到你

关于数据库的order by什么意思和对order by的理解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

数据库的order by什么意思(对order by的理解)

本文编辑:admin

更多文章:


ui培训班 千锋(千锋培训多少钱)

ui培训班 千锋(千锋培训多少钱)

各位老铁们好,相信很多人对ui培训班 千锋都不是特别的了解,因此呢,今天就来为大家分享下关于ui培训班 千锋以及千锋培训多少钱的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录千锋培训多少钱千锋的IT培训真的很厉害

2026年1月15日 02:00

fscan工具(fscan禁止ping扫描)

fscan工具(fscan禁止ping扫描)

大家好,今天小编来为大家解答以下的问题,关于fscan工具,fscan禁止ping扫描这个很多人还不知道,现在让我们一起来看看吧!本文目录fscan禁止ping扫描渗透测试用什么工具好呢支持udp扫描软件有fscanfscan使用报错fsc

2026年5月1日 21:15

mysql系统找不到指定文件(mysql中找不到指定文件路径怎么办)

mysql系统找不到指定文件(mysql中找不到指定文件路径怎么办)

其实mysql系统找不到指定文件的问题并不复杂,但是又很多的朋友都不太了解mysql中找不到指定文件路径怎么办,因此呢,今天小编就来为大家分享mysql系统找不到指定文件的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本

2026年2月4日 11:45

无人机rx是什么没电(tx和rx是什么意思)

无人机rx是什么没电(tx和rx是什么意思)

大家好,如果您还对无人机rx是什么没电不太了解,没有关系,今天就由本站为大家分享无人机rx是什么没电的知识,包括tx和rx是什么意思的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录tx和rx是什么意思大疆rx增益是

2026年4月2日 17:00

列表网页设计(网页设计中<dl>属于什么列表标记、<ol>属于什么列表标记)

列表网页设计(网页设计中<dl>属于什么列表标记、<ol>属于什么列表标记)

今天给各位分享网页设计中属于什么列表标记、属于什么列表标记的知识,其中也会对网页设计中属于什么列表标记、属于什么列表标记进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录网页设计中属于什么列表标记、属于什么列表标

2026年8月15日 18:30

jdk win7环境变量(win7系统配置环境变量JAVAHOME的方法)

jdk win7环境变量(win7系统配置环境变量JAVAHOME的方法)

大家好,关于jdk win7环境变量很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于win7系统配置环境变量JAVAHOME的方法的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希

2026年6月10日 21:00

自学devops认证靠谱吗(devops教程自己学习可以吗)

自学devops认证靠谱吗(devops教程自己学习可以吗)

其实自学devops认证靠谱吗的问题并不复杂,但是又很多的朋友都不太了解devops教程自己学习可以吗,因此呢,今天小编就来为大家分享自学devops认证靠谱吗的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录de

2026年6月6日 05:15

countifs时间范围统计(Excel怎样统计 指定日期范围 内出现的次数)

countifs时间范围统计(Excel怎样统计 指定日期范围 内出现的次数)

大家好,如果您还对countifs时间范围统计不太了解,没有关系,今天就由本站为大家分享countifs时间范围统计的知识,包括Excel怎样统计 指定日期范围 内出现的次数的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年7月27日 11:30

join和in哪个查询更快(left join和in哪种查询效率要好)

join和in哪个查询更快(left join和in哪种查询效率要好)

各位老铁们好,相信很多人对join和in哪个查询更快都不是特别的了解,因此呢,今天就来为大家分享下关于join和in哪个查询更快以及left join和in哪种查询效率要好的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2025年6月14日 05:15

决策树属性选择的方法(简述决策树的原理和方法)

决策树属性选择的方法(简述决策树的原理和方法)

大家好,如果您还对决策树属性选择的方法不太了解,没有关系,今天就由本站为大家分享决策树属性选择的方法的知识,包括简述决策树的原理和方法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录简述决策树的原理和方法决策树法的

2026年7月23日 05:30

太原编程学校排名(山西太原计算机学校排名那个学校比较好)

太原编程学校排名(山西太原计算机学校排名那个学校比较好)

大家好,太原编程学校排名相信很多的网友都不是很明白,包括山西太原计算机学校排名那个学校比较好也是一样,不过没有关系,接下来就来为大家分享关于太原编程学校排名和山西太原计算机学校排名那个学校比较好的一些知识点,大家可以关注收藏,免得下次来找不

2025年11月6日 06:45

power query是干嘛的(怎样使用excel或POWER QUERY对多张表追加合并)

power query是干嘛的(怎样使用excel或POWER QUERY对多张表追加合并)

“power query是干嘛的”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看power query是干嘛的(怎样使用excel或POWER QUERY对多张表追加合并)!本文目录怎样使用excel或POWER QUERY

2026年3月11日 00:00

emotion(mood和emotion有什么区别啊)

emotion(mood和emotion有什么区别啊)

大家好,emotion相信很多的网友都不是很明白,包括mood和emotion有什么区别啊也是一样,不过没有关系,接下来就来为大家分享关于emotion和mood和emotion有什么区别啊的一些知识点,大家可以关注收藏,免得下次来找不到哦

2025年7月28日 20:45

square root(计算器里的sqrt是什么意思)

square root(计算器里的sqrt是什么意思)

这篇文章给大家聊聊关于square root,以及计算器里的sqrt是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录计算器里的sqrt是什么意思envi4.6.1中square root是什么效果平方根的定义是什么

2025年7月7日 19:30

织梦程序创始人(关于织梦常识)

织梦程序创始人(关于织梦常识)

大家好,织梦程序创始人相信很多的网友都不是很明白,包括关于织梦常识也是一样,不过没有关系,接下来就来为大家分享关于织梦程序创始人和关于织梦常识的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录关于织梦常识个人博客的

2026年9月14日 11:45

css特效放大(像百度图片那样,鼠标移上去就放大的效果怎么弄求帮忙)

css特效放大(像百度图片那样,鼠标移上去就放大的效果怎么弄求帮忙)

今天给各位分享像百度图片那样,鼠标移上去就放大的效果怎么弄求帮忙的知识,其中也会对像百度图片那样,鼠标移上去就放大的效果怎么弄求帮忙进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录像百度图片那样,鼠标移上去就放

2026年9月22日 02:30

flex版本啥意思(云顶之弈flex是什么意思)

flex版本啥意思(云顶之弈flex是什么意思)

这篇文章给大家聊聊关于flex版本啥意思,以及云顶之弈flex是什么意思对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录云顶之弈flex是什么意思flex是什么意思买了双NIKE的气垫跑鞋,鞋底有 Flex是什么意思韩国人说f

2025年12月30日 13:15

calendarprovider能删除吗(华为手机荣耀7哪些东西可以删除吗)

calendarprovider能删除吗(华为手机荣耀7哪些东西可以删除吗)

各位老铁们好,相信很多人对calendarprovider能删除吗都不是特别的了解,因此呢,今天就来为大家分享下关于calendarprovider能删除吗以及华为手机荣耀7哪些东西可以删除吗的问题知识,还望可以帮助大家,解决大家的一些困惑

2026年3月27日 14:45

javascript图表(jeesite怎么引入jscharts.js图表)

javascript图表(jeesite怎么引入jscharts.js图表)

大家好,今天小编来为大家解答以下的问题,关于javascript图表,jeesite怎么引入jscharts.js图表这个很多人还不知道,现在让我们一起来看看吧!本文目录jeesite怎么引入jscharts.js图表javaScript矢

2026年9月8日 05:00

minidump蓝屏解决方法win10(Windows10电脑总是蓝屏,终止代码:DRIVER-POWER-STATE-FAILURE怎么解决)

minidump蓝屏解决方法win10(Windows10电脑总是蓝屏,终止代码:DRIVER-POWER-STATE-FAILURE怎么解决)

其实minidump蓝屏解决方法win10的问题并不复杂,但是又很多的朋友都不太了解Windows10电脑总是蓝屏,终止代码:DRIVER-POWER-STATE-FAILURE怎么解决,因此呢,今天小编就来为大家分享minidump蓝屏解

2026年9月13日 21:30

近期文章

regularly up(翻译英文、)
2026-09-25 00:30:01
本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索