InnoDB
には、インデックスを別途作成するための特別な最適化機能がありません。
このため、テーブルをエクスポートしてインポートし、その後にインデックスを作成しなおしても意味がありません。
テーブルを最も速く InnoDB
に変換するには、InnoDB
テーブルに直接データを挿入します。つまり、ALTER
TABLE ... TYPE=INNODB
を使用するか、あるいは同じ定義で空の InnoDB
テーブルを作成し、INSERT INTO ... SELECT *
FROM ...
でレコードを挿入します。
挿入処理を管理しやすくするために、大きなテーブルは分割して挿入するとよいでしょう。
INSERT INTO newtable SELECT * FROM oldtable WHERE yourkey > something AND yourkey <= somethingelse;
すべてのデータを挿入した後に、テーブル名を変更することができます。
大きなテーブルを変換する際には、InnoDB のバッファプールサイズを大きくして、ディスク I/O を削減する必要があります。ただし、物理メモリの 80% を超えないようにしてください。 InnoDB のログファイルおよびログバッファも大きなサイズに設定します。
テーブルスペースが不足していないことを確認します。InnoDB
テーブルは、MyISAM
テーブルよりも多くの領域を使用します。ALTER
TABLE
で領域が足りなくなると、ロールバックが実行されます。ロールバックがディスクバウンドすると、完了までに数時間を要する可能性があります。
挿入の際は、InnoDB
が挿入バッファを使用してセカンダリインデックスレコードをまとめてインデックスにマージします。これによって、ディスク
I/O
が大幅に削減されます。ロールバックではこのようなメカニズムが使用されないため、挿入の
30 倍の時間がかかる場合があります。
ロールバックが暴走した場合は、データベースに貴重なデータがなければ、膨大なディスク
I/O
の完了を待つよりも、データベースプロセスを強制終了し、すべての
InnoDB データファイルとログファイル、および
InnoDB テーブルの .frm
ファイルを削除したうえで、再度ジョブを実行した方が得策です。
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.