😤

同じクエリでもデータ量によって返ってくるレコードの順番が変わる

同じクエリなら常に同じ順番で返ってくるものだと思ってた


なにが起こったか

下のようなクエリでレコードを取得したとき

SELECT * FROM table_name WHERE post_id IN (1, 2, 3, 4, 5)

検索対象のレコード数が少ないローカル環境では primary key 順、レコードが多い開発環境では post_id 順でレコードが返ってきた。 これにより、環境によって UI の表示が変わってしまった

なぜ

ORDER BY を指定しなかった場合、MySQL ではどうやら適当な順番でレコードが返ってくるらしい。 ここでいう適当な順番とは「MySQL が自然に返せる順番」とのこと。自然に返せるというのがよくわからない

実行計画に依存するということなので、データ量によってレコードの順番が変わったのは実行計画が変わったということか。 ORDER BY がないほうが好ましいが、どうしても順序が同じでない困るときは ORDER BY をつけるしかなさそう


ref.