11069


MySQL で ORDER BY を指定しない時、SELECT結果並び順 の法則性に関するドキュメントは公開されているでしょうか？

・必要なら、ORDER BY を 指定した方がよいとは思うのですが、 **指定しない場合は、どういう基準で、並び順を決定** しているのでしょうか？  
・インデックスは関係する？  
・バージョンによって異なる？  
・それに関する資料はどこかにない？

* * *

質問背景を追記しました。

・単なる興味本位です  
・ORDER BY を 指定しない場合、MySQL
はどういう思考に基づいて処理を行うのか、そこには一定の法則があると思うのですが、そこを開示していないのかな、と思いました  
(オープンソースだけど、処理内容を読み解くことは実質的に不可能？)  
・また、標準SQLで、「ORDER BY を指定しない」場合の取り扱いについて具体的にどう言及しているか、について知りたかったです


CC BY-SA 3.0
2015-06-07T00:35:57.143
11058
2018-08-29T04:01:12.937
2015-06-07T22:52:53.483
7886
7886
question
mysql
ORDER BY を指定しない時 ／ SELECT結果表示並び順 の法則性


ORDER BY を指定しない場合の並び順には **何の保証もありません** 。

RDBMS
がやりやすいように抽出した結果をそのまま返すわけですから、ストレージエンジンと実行計画による影響が大きいように思います。当然バージョンやインデックスによっても変化します。極論を言えば、パフォーマンスを追求した結果、キャッシュの状態で結果が変化する実装になるかもしれません。

「何らかの基準で並び順が決定」されることを望むなら ORDER BY を使ってください。

* * *

前述のように、「デフォルトの並び順」は利用者からすれば気にしてはならないものですし、開発者からしても気にする必要のない物ですから、まとまった資料は開発者向けとしても存在しない気がします。


CC BY-SA 3.0
2015-06-07T01:38:11.597
11059
2015-06-07T01:38:11.597
8000
11058
answer


こちらに似たような議論があります。

[MySQL row order for "SELECT * FROM table_name;" - Stack
Overflow](https://stackoverflow.com/questions/1949641/mysql-row-order-for-
select-from-table-name)

これを読むとやはり、結論としては法則性も保証もない、ということになりますね。

単純な興味で「どうなるの？」って思うのは良いと思いますが、実務で使うSQLでは「ORDER
BYを指定しない場合の法則性」に期待するのはNGだと思います。ORDER BYはちゃんと指定すべきです。


CC BY-SA 3.0
2015-06-07T01:43:00.837
11060
2015-06-07T01:43:00.837
2017-05-23T12:38:56.083
-1
85
11058
answer


SQLの仕様上SELECTで取得できる列の並びが保証されているのはORDER
BYが指定されている場合のみです。指定されていない場合の挙動は仕様には定義されていないので、実装依存となります。

そこで実装側を考えると、一定の並びを保証するということはその通りに並び替えるコストが生じることになりますので、ORDER
BYを指定しないというのは利用者からすれば余計な処理はするなという意思表示でもあります。従って多くの実装ではORDER
BYが指定されない場合は特別に並び替えをしません。

したがって、

> 指定しない場合は、どういう基準で、並び順を決定しているのでしょうか？

という疑問への答えは、「並び順を決定していない」となります。

実際に列の順番がどうなるかはストレージ上の並びかもしれませんしインデックス順かもしれません。実行計画によっても変わるでしょうからエンジンのバージョンにって変わるのも当然あり得ることです。

具体的な記述としては以下のようなものがありました。

JIS X 3005-2:2010 4.14.2にはこう書かれています。

> 問合せ式によって指定される表の行の順序付けは，ORDER BY 句を直に含む問合せ式に対してだけ保証される。

[こちらのSQL99の解説書](https://mariadb.com/kb/en/sql-99/order-by-
clause/)には以下の記述があります。

> An ORDER BY clause may optionally appear after a : it specifies the order
> rows should have when returned from that query (if you omit the clause, your
> DBMS will return the rows in some random order).

実装側だと、[PostgreSQLのマニュアル](https://www.postgresql.jp/document/9.4/html/sql-
select.html)

> ORDER BYが指定されない場合は、システムが計算過程で見つけた順番で行が返されます


CC BY-SA 3.0
2015-06-07T06:19:50.513
11069
2015-06-07T23:57:44.307
2015-06-07T23:57:44.307
5793
5793
11058
answer


こと mysql に限っていうと、 explain して得られる実行計画にしたがってレコードを取得していって、見つけた順に返ってきています。

mysql + innodb であった場合、 innodb はあらゆるデータアクセスがなにかしらの index を経由して行われるため、 order by
を付与しなくても結果は何かしら(システムが決定した順序に従い)ソートされているように見えたりもします。

ただ、これは innodb がたまたまそういう構造であったからそうなっているだけで、たとえば mysql + MyISAM
であった場合は、本当にディスクの空いているところに行を詰めこんで行ったレコードたちが、そのディスクに格納されている順に返ってきている様子が、
@JunichiIto さんの回答から飛べる stackoverflow の回答にて記述されています。


CC BY-SA 4.0
2018-08-29T04:01:12.937
47903
2018-08-29T04:01:12.937
754
11058
answer