重要:mysql
データベース(user
や
host
のような)内の MySQL システム
テーブルを InnoDB
タイプに変換しないでください。これはサポートされていない操作です。システム
テーブルは必ず MyISAM
タイプの物でなければいけません。
もし全ての(非システムの)テーブルを
InnoDB
テーブルとして作成したければ、サーバ
オプション ファイルの [mysqld]
セクションにライン
default-storage-engine=innodb
を追加するだけでよいです。
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
が2番目のインデックス
レコードをバッチとして書く為にそれ自身の挿入バッファを利用する事ができるので、この作業をするとディスク
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つ目のインデックス
レコードをマージする為に挿入バッファを利用します。それでディスク
I/O
を大幅に節約する事ができます。ロールバックにはそのような構造は利用されず、挿入の30倍の時間がかかります。
ロールバックが暴走した場合は、データベースに貴重なデータがなければ、膨大なディスク
I/O の完了を待つよりも、データベース
プロセスを強制終了したほうが良いでしょう完全な手順に関しては、項13.5.8.1. 「InnoDB
復旧の強制」
を参照してください。