2012-01-05 65 views
35

当没有使用ORDER BY时,查询的默认顺序是什么?SQL:什么是查询的默认排序依据?

+2

我相信这取决于存储引擎和潜在的索引。 – smp7d 2012-01-05 17:10:22

+0

有用的答案可以在类似的问题中找到,例如[处理默认排序顺序的SQL最佳实践](http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort - 顺序)和[MySQL行顺序为“SELECT * FROM table_name;”](http://stackoverflow.com/questions/1949641/mysql-row-order-for-select-from-table-name)。 – Wiseguy 2012-01-05 17:26:25

回答

16

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

+0

仍然如果你知道引擎和现有的索引,你可以预测订单=) – newtover 2012-01-05 18:47:47

+0

@newtover true,但添加'ORDER BY'比预测查询计划容易得多,并且回顾我建议坚持的物理布局对前者:)很高兴在这里见到你,无论如何。 – alf 2012-01-05 19:02:34

+0

当显式排序可能会导致临时表和文件夹时,预测顺序非常有用,但所需的顺序已经存在。尽管如此,明确优于暗示。很高兴认识你:) – newtover 2012-01-05 19:13:32

42

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

  • 采取ORDER BY丢失时不要依赖顺序。

  • 总是指定ORDER BY如果你想要一个特定的订单 - 在某些情况下,引擎可以消除ORDER BY,因为它的 做了一些其他的步骤。

  • GROUP BY forces ORDER BY。 (这是违反标准的,可以通过使用ORDER BY NULL来避免。)

SELECT * FROM tbl - 这将执行“表扫描”。如果该表有 从未有过任何删除/替换/更新,则记录在插入顺序中恰好为 ,因此您观察到了这一情况。

如果你已经用InnoDB表完成了同样的语句,他们将 以PRIMARY KEY顺序传递,而不是INSERT顺序。 这是一个基础实现的神器,不是 所依赖的东西。

+0

很好的回答,它与http://dba.stackexchange和谐一致。 com/q/6051/877,因为在存储引擎和版本之间并不能保证预定的顺序。 +1 !!! – RolandoMySQLDBA 2012-01-05 17:26:38

2

默认排序将取决于查询中使用的索引以及它们的使用顺序。它可以随着数据/统计信息的变化而改变,优化器可以选择不同的计划。

如果你想在一个特定的顺序数据,使用ORDER BY

3

我发现SQL Server处于其默认顺序(根据年龄和数据的复杂性),这是好的,几乎是随机的它迫使你指定所有的顺序。

(我依稀记得甲骨文是在这方面类似于SQL Server)。

的MySQL默认情况下,似乎通过在磁盘上记录结构,(可以包括由于缺失和乱序输入命令优化),但它通常最初愚弄开发人员不打扰使用order by子句,因为数据似乎默认为主键排序,这是而不是的情况!

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

我have't发现文档上这种变化,却发现notes on on implicit group order in MySQL

默认情况下,MySQL的,如果你指定ORDER BY col1中所有排序GROUP BY COL1,COL2,...查询,COL2, ...在查询中也是如此。

但是:

依赖隐式GROUP BY排序在MySQL 5.5已经过时了。要实现分组结果的特定排序顺序,最好使用明确的ORDER BY子句。

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