MySQLはデフォルトで索引構成表
Oracleを普段使っているとちょっと驚きなんですが、MySQLは特に指定しない限り、主キーを使った索引構成表となってます。適当に入れたデータでも検索すると主キー順で返ってくるから妙だと思ったらびっくりです(笑)。
13.5.13. InnoDB テーブルとインデックス構造
http://dev.mysql.com/doc/refman/5.1/ja/innodb-table-and-index.html
全ての InnoDB テーブルは、行のデータが格納されている clustered index と呼ばれる特別なインデックスを持っています。もし PRIMARY KEY をテーブル上で定義したら、主キーのインデックスは集合インデックスになります。
もしテーブルに PRIMARY KEY を定義しなければ、MySQL は主キーとして NOT NULL カラムだけを持つ最初の UNIQUE インデックスを選択し、InnoDB がそれを集合インデックスとして利用します。もしテーブル内にそのようなインデックスがなければ、InnoDB は、行が InnoDB がそのようなテーブル内の行に割り当てた行 ID によってオーダされる集合インデックスを内部的に生成します。行 ID は、新しい行が挿入されると単調に増加する6バイトのフィールドです。従って、行 ID によってオーダされた行は物理的に挿入順になっています。
以前使ったtestテーブルにて実験。
定義と現状データは以下の通り。
mysql> desc test;
Field Type Null Key Default Extra id int(11) NO PRI NULL varStr varchar(20) YES NULL mysql> select * from test;
id varStr 1 40010 2 40 3 409 4 41 5 41001
上記のテーブルに対してデータを挿入して、Order byなしの全件検索をかけます。
mysql> insert into test values(100, '2048');
mysql> insert into test values(99, '2432');
mysql> insert into test values(95, '12345');
mysql> insert into test values(96, '543');mysql> select * from test;
id varStr 1 40010 2 40 3 409 4 41 5 41001 95 12345 96 543 99 2432 100 2048
上記の様に、適当な順番でレコードを挿入し、Order byを付けなかった場合でも、主キー昇順でソートした場合と同様の結果が戻ります。主キーを設定しなかった場合は内部的に自動採番のIDを作成してその順番に格納するので、挿入順になりますね。