[+/-]
MySQL
は、テーブルのデータディクショナリ情報を、データベースディレクトリ内の
.frm
ファイルに保存します。ところが、InnoDB
型のテーブルは、テーブルスペース内の InnoDB
内部データディクショナリにも独自のエントリを持っています。MySQL
は、テーブルやデータベースを破棄するときに、.frm
ファイルおよび InnoDB
データディクショナリ内の対応するエントリの両方を削除する必要があります。
このために、単に .frm
ファイルを移動するだけではデータベース間で
InnoDB テーブルを移動できません。また、MySQL
3.23.43 以下のバージョンで InnoDB
型のテーブルがあると DROP DATABASE
が機能しなかったのもこれが原因です。
すべての InnoDB
テーブルには、クラスタードインデックスと呼ばれる、レコードのデータを格納する特別なインデックスがあります。テーブルで
PRIMARY KEY
を定義すると、主キーのインデックスがクラスタードインデックスになります。
テーブルに主キーを定義しない場合は、InnoDB によって内部的にクラスタードインデックスが作成され、そこで InnoDB がテーブル内のレコードに割り当てるロー ID の順にレコードが並べられます。ロー ID は 6 バイトのフィールドで、新しいレコードが挿入されると単純に数が増加していきます。したがって、ロー ID の順に並べられたレコードは、物理的に挿入された順で並ぶことになります。
クラスタードインデックスを介したレコードへのアクセスは迅速です。これは、インデックス検索が行われるページにレコードデータが配置されるためです。他の多くのデータベースでは、データがインデックスレコードとは別のページに伝統的に格納されています。一般に、テーブルが大きい場合は、クラスタードインデックスの方が従来の方法よりもディスク I/O が少なくなります。
InnoDB では、非クラスタードインデックス(セカンダリインデックスとも呼ばれる)のレコードにレコードの主キー値が含まれています。InnoDB はこの主キー値を使用して、クラスタードインデックスからレコードを検索します。主キーが長いと、セカンダリインデックスの使用する領域が増えることに注意してください。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.