MySQL使用SELECT 语句不加ORDER BY默认是如何排序的?

2024-05-18 23:48

本文主要是介绍MySQL使用SELECT 语句不加ORDER BY默认是如何排序的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是阿飞云

怕什么真理无穷,进一步有近一步的欢喜

记录一个MySQL查询排序的问题,一个SQL语句没有加order by,那么查询出来的结果到底是按照什么规则排序的呢?查询了网上的一些资料,分享如下:

•MyISAM 表

MySQL Select 默认排序是按照物理存储顺序显示的(不进行额外排序)。也就是说SELECT * FROM tbl – 会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。

•InnoDB 表

同样的情况,会按主键的顺序排列,需要再次强调,这只是潜规则,实际也不一定完全靠谱的。

参考:MySQL也有潜规则 – Select 语句不加 order by 如何排序?[1]



如果没有定义 order by:

那返回的数据不一定是按照主键来排序的,结果可以以任意顺序返回 - 也可能随着时间而改变。

在关系数据库中没有“自然顺序”或类似的东西(至少在我所知道的情况下)。获得可靠排序的唯一方法是显式指定 order by子句,来源when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record[2]

对于同样的一批数据,在某一个时刻顺序是一样的,随着时间变化,数据会发生变化,那么在进行查询的时候,MySQL 会尝试以尽可能快的方法(MySQL 实际的方法不见得快)返回数据。

由于访问主键、索引大多数情况会快一些(在Cache里)所以返回的数据有可能以主键、索引的顺序输出,这里并不会真的进行排序,主要是由于主键、索引本身就是排序放到内存的,所以连续输出时可能是某种序列。在一些情况下消耗硬盘寻道时间最短的数据会先返回。如果只查询单个表,在特殊的情况下是有规律的。



下面的内容分析来源:what-is-the-default-order-of-records-for-a-select-statement-in-mysql[3]

MySQL 中 SELECT 语句的默认记录顺序是什么?

9663fe76d9b0cf462bcd9b28ef54e20a.png

里面有一个认可和点赞比较高的回答:

50f892741b201ab437e0bf244fe13882.png

大致解读一下回答的内容,重新发布一下之前回答过的一个SQL Server类型的问题。

在 SQL 世界中,顺序不是一组数据的固有属性。因此,除非您使用 order by 子句查询您的数据,否则您无法从 RDBMS 保证您的数据将按特定顺序返回 - 甚至以一致的顺序返回。

然后回答你的问题:

•MySQL 根据需要对记录进行排序,但没有任何一致性保证•如果您打算依赖此顺序进行任何操作,则必须使用 order by 指定您想要的顺序。否则做任何其他事情都是在为不受欢迎的意外做好准备。

这是所有 SQL 的属性,而不仅仅是 MySQL。SQL-92 规范中的相关文本是:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

如果未指定 <order by 子句>,则 Q 的行的顺序取决于底层实现。


本文的内容就是如上这些内容了,大致总结一下: 如果在使用没有指定order by,那么基本上依赖于底层实现的,具体排序规则不定,所以排序的顺序也不固定,可能会随着时间发生变化

在实际工作中,如果有查询列表展示数据的功能和需求,开发前一定要先确定数据排序的规则,这样可以避免后续出现数据查询的排序结果不同的问题。

如果对MySQL SELECT 语句的默认记录顺序有了解或者有研究的伙伴,欢迎留言分享你的理解。

如果文章对你有所帮助,点赞支持一下,感谢你的慷慨~

References

[1] MySQL也有潜规则 – Select 语句不加 order by 如何排序?: https://www.cnblogs.com/lushilin/p/6094373.html
[2] when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record: https://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record
[3] what-is-the-default-order-of-records-for-a-select-statement-in-mysql: https://dba.stackexchange.com/questions/6051/what-is-the-default-order-of-records-for-a-select-statement-in-mysql

推荐阅读

MySQL数据库设计规范,值得一读

MySQL数据库之互联网常用分库分表方案

【 一个人看起来在进行逻辑思考,但其实大多数时间只是在进行记忆检索。】

41bbf411055d6fa9d7a80d18d1fec550.png

See you next good day~

这篇关于MySQL使用SELECT 语句不加ORDER BY默认是如何排序的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995686

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析