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を作成してその順番に格納するので、挿入順になりますね。