2012-01-05 177 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子句。

因此,與其他答案一致 - 不要依賴任何數據庫中的默認或隱式排序。