SQL:查询的默认Order By是什么?

Vij*_*yan 50 mysql

ORDER BY使用no时,查询的默认顺序是什么?

Rah*_*hul 49

没有这样的订单.取自http://forums.mysql.com/read.php?21,239471,239688#msg-239688

  • 如果缺少ORDER BY,请不要依赖订单.

  • 如果您想要特定订单,请始终指定ORDER BY - 在某些情况下,引擎可以消除ORDER BY,因为它执行其他步骤.

  • GROUP BY强制ORDER BY.(这违反了标准.使用ORDER BY NULL可以避免这种情况.)

SELECT * FROM tbl - 这将进行"表扫描".如果表从未有任何DELETE/REPLACEs/UPDATE,则记录将恰好处于插入顺序中,因此您观察到的是.

如果您使用InnoDB表执行了相同的语句,则它们将以PRIMARY KEY顺序而非INSERT顺序传递.同样,这是底层实现的工件,而不是依赖的东西.


alf*_*alf 19

没有.根据您查询的内容以及查询的优化方式,您可以获得任何订单.甚至不能保证看起来相同的两个查询将以相同的顺序返回结果:如果您没有指定它,则不能依赖它.

  • 不过,如果您知道引擎和现有索引,您可以预测顺序 =) (2认同)
  • @newtover 是的,但添加`ORDER BY` 比预测查询计划和回忆物理布局要容易得多,我建议坚持前者:) 无论如何,很高兴在这里见到你。 (2认同)
  • @newtover 这对我来说是一个非常脆弱的设计:我无法想象“显式排序可能会导致临时表和文件排序”的情况,同时所需的顺序已经存在(即我们有正确排序的索引,但没有使用它们进行排序?);另一方面,数据库升级或存储更改可能会破坏这个技巧......看到它得到回报的情况会很有趣。 (2认同)
  • 我在帖子中描述了一个例子:http://newtover.tumblr.com/post/15403298770/mysql-on-implicit-order-by (2认同)

sci*_*lot 6

我发现 SQL Server 的默认顺序几乎是随机的(取决于数据的年龄和复杂性),这很好,因为它强制您指定所有顺序。

(我依稀记得 Oracle 在这方面类似于 SQL Server。)

默认情况下,MySQL 似乎按磁盘上的记录结构排序(可能包括由于删除和优化而导致的乱序条目),但它最初常常愚弄开发人员不费心使用 order-by 子句,因为数据似乎默认为主键排序,事实并非如此!

我今天惊讶地发现,MySQL 5.6 和 4.1 隐式地对已在相反方向上有限分辨率的列上排序的记录进行排序。我的一些结果具有相同的排序值,并且整体顺序是不可预测的。例如,在我的情况下,它是按日期时间列排序的 DESC,并且某些条目在同一秒内,因此无法明确排序。在 MySQL 5.6 上,它们按一种顺序(插入顺序)进行选择,但在 4.1 中,它们向后选择!这导致了一个非常烦人的部署错误。

我没有找到有关此更改的文档,但找到了有关MySQL 中隐式顺序的说明

默认情况下,MySQL 对所有 GROUP BY col1, col2, ... 查询进行排序,就像您在查询中指定 ORDER BY col1, col2, ... 一样。

然而:

在 MySQL 5.5 中依赖隐式 GROUP BY 排序已被弃用。要实现分组结果的特定排序顺序,最好使用显式 ORDER BY 子句。

因此,与其他答案一致-永远不要依赖任何数据库中的默认或隐式排序。