当没有使用ORDER BY
时,查询的默认顺序是什么?
答案 0 :(得分:48)
没有这样的订单。取自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顺序。再次, 这是底层实现的工件,而不是 依靠。
答案 1 :(得分:18)
没有。根据您查询的内容以及查询的优化方式,您可以获得任何订单。甚至不能保证两个看起来相同的查询将以相同的顺序返回结果:如果你没有指定它,你就不能依赖它。
答案 2 :(得分:4)
我发现SQL Server的默认顺序几乎是随机的(取决于数据的年龄和复杂程度),这很好,因为它会强制您指定所有顺序。
(我依旧记得Oracle在这方面与SQL Server类似。)
默认情况下,MySQL似乎按磁盘上的记录结构排序(由于删除和优化可能包括无序条目),但它通常最初欺骗开发人员不使用order-by子句,因为数据出现默认为主键排序,不情况!
我很惊讶今天发现,MySQL 5.6和4.1隐含的子订单记录已经在相反方向上具有有限分辨率的列上排序。我的一些结果具有相同的排序值,整体顺序是不可预测的。例如在我的例子中,它是一个按日期时间列排序的DESC,并且一些条目在同一秒内,因此它们无法明确排序。在MySQL 5.6上,他们选择一个顺序(插入顺序),但在4.1中他们选择向后!这导致了一个非常烦人的部署错误。
我找不到有关此更改的文档,但找到了notes on on implicit group order in MySQL:
默认情况下,MySQL会对所有GROUP BY col1,col2,...查询进行排序,就像您在查询中指定ORDER BY col1,col2,...一样。
但是:
不推荐在MySQL 5.5中依赖隐式GROUP BY排序。要实现分组结果的特定排序顺序,最好使用显式ORDER BY子句。
因此,与其他答案一致 - 永远不要依赖任何数据库中的默认或隐式排序。
答案 3 :(得分:2)
默认排序取决于查询中使用的索引以及它们的使用顺序。它可以随着数据/统计数据的变化而变化,优化程序会选择不同的计划。
如果您希望按特定顺序输入数据,请使用ORDER BY