mysqlのwhere句でin述語をつけたら順序がどうなるか

mysqlにおいて、where~inを使った時、order byに何も指定しなかったらその順番で取り出してくれるんじゃなかろうか。

だって、順序つけて指定できるんだし、order by fieldでもう一度指定するとか面倒じゃん。という浅はかな夢を打ち砕くテスト。

select * from tmp
where id in ( 10 , 9 , 5 , 6 ,1, 2 ,3);

って書いたらその順で取り出されるんじゃないかと思いテスト。

テストテーブル定義分
テストテーブル定義分
テストテーブルテストデータ挿入文
テストテーブルテストデータ挿入文
order byもinにも何も指定しなかった
order byもinにも何も指定しなかった
inに指定しちゃった
inに指定しちゃった

なんとなくだけど取り出されそうな気がしてた。

idって主キーだからB-Treeだろうし、whereで抜き出すときってほら、上から順番に抜いてくれるじゃん。 -> これはクエリオプティマイザが判断することであって、全部みるかインデックスだけみるか、とか、そいういう要素によって変わる。

これtemporary tableだからmyisamとかinnodbとかだと結果が変わるのかもしれないけども、一つの結果として得られただけで十分。

その結果は、”選択は集合に対する操作であって、その順序を保証するものではない、ということを再認識できた”、ことである。

面倒だからorder by fieldしなくなればいいなぁと思ったのは単なる夢でした。でもデータが少ないけどid順で取り出してるのはインデックス使ってるせいなのかな。memoryテーブルだとたしかインデックスってhashだったよな。hashって意識して使ったことないけどどうなるんだろ。

以上。

コメントを残す