InnoDB
以外のテーブルが
InnoDB
を使用するように変換を行うには、次のように
ALTER TABLE
を使用します。
ALTER TABLE t1 ENGINE=InnoDB;
mysql
データベース内の MySQL システムテーブル
(user
や
host
など) を
InnoDB
型に変換しないでください。これはサポートされていない操作です。システムテーブルは必ず
MyISAM
型のものでなければいけません。
InnoDB
は、MyISAM
ストレージエンジンがするのと同じように、インデックスを別々に作成するための特別な最適化を行いません。従って、テーブルをエクスポート、インポートしたり、あとでインデックスを作成したりはしません。テーブルを
InnoDB
に変換する一番早い方法は、InnoDB
テーブルに直接挿入することです。それは、ALTER
TABLE ... ENGINE=INNODB
を利用する、または同一定義を利用して空の
InnoDB
テーブルを作成し、INSERT INTO
... SELECT * FROM ...
を利用して行を挿入するということです。
もし 2 番目のキー上に
UNIQUE
制限があったら、インポート操作の最中に一時的に一意性確認を切り、テーブルインポートのスピードを上げることができます:
SET unique_checks=0;
... import operation ...
SET unique_checks=1;
大きいテーブルに対しては、InnoDB
が二次インデックスレコードをバッチとして書くためにそれ自身の挿入バッファーを利用することができるので、この作業をするとディスク
I/O
を大幅に節約することができます。データが重複キーを含んでいないことを必ず確認してください。unique_checks
はストレージエンジンが重複キーを無視することを許可しますが、それを要求はしません。
挿入の操作性をあげるためには、大きいテーブルを細かく分けて挿入するのが良いでしょう:
INSERT INTO newtable SELECT * FROM oldtable WHERE yourkey > something AND yourkey <= somethingelse;
すべてのレコードが挿入されたあとで、テーブルをリネームすることができます。
大きいテーブルの変換の最中に、ディスク I/O
を減らすために InnoDB
バッファープールのサイズを増やす必要があります。しかし、物質的メモリーの
80%
以上は利用しないでください。InnoDB
ログファイルのサイズを増やすこともできます。
テーブル領域を一杯にしないように注意してください:InnoDB
テーブルは MyISAM
テーブルよりも多くのディスク領域を必要とします。もし
ALTER TABLE
操作で領域を使い切ってしまうと、それはロールバックを始め、それがディスクに頼っている場合何時間も時間がかかります。挿入には、InnoDB
はバッチ内のインデックスに 2
つめのインデックスレコードをマージするために挿入バッファーを利用します。それにより多くのディスク入出力が削減されます。ロールバックではそのような機構は使用されないため、ロールバックは挿入よりも
30 倍長くかかる可能性があります。
ロールバックが暴走した場合は、データベースに貴重なデータがなければ、膨大なディスク
I/O
の完了を待つよりも、データベースプロセスを強制終了したほうが良いでしょう完全な手順に関しては、項9.6.2. 「InnoDB
復旧の強制」
を参照してください。
(システムテーブル以外の) すべてのテーブルを
InnoDB
テーブルとして作成するには、サーバーオプションファイルの
[mysqld]
セクションに
default-storage-engine=innodb
という行を追加します。