次の抜粋は、本「High Performance MySQL、Second Edition」から出されたものです。
これは素晴らしい本で、私は誰にでもそれをお勧めします。
短い答えは:
テーブルのサイズと条件により、どの方法を選択しても、長い間待機している可能性があります。
テーブル変換
テーブルをあるストレージエンジンから別のストレージエンジンに変換する方法はいくつかあり、それぞれに長所と短所があります。
他の机
mysql> ALTER TABLE mytable ENGINE = Falcon;
この構文はすべてのストレージエンジンで機能しますが、かなりの時間がかかる場合があります。MySQLは古いテーブルを行ごとに新しいテーブルにコピーします。その間、おそらくサーバーのすべてのディスクI / O容量を使用していて、変換の実行中は元のテーブルが読み取りロックされます。
ダンプしてインポート
変換プロセスをより詳細に制御するには、最初にmysqldumpユーティリティを使用してテーブルをテキストファイルにダンプすることを選択できます。テーブルをダンプしたら、ダンプファイルを編集して、含まれているCREATE TABLEステートメントを調整するだけです。テーブル名とタイプを必ず変更してください。タイプが異なる場合でも、同じデータベースに同じ名前のテーブルを2つ作成することはできません。mysqldumpはデフォルトで、CREATE TABLEの前にDROP TABLEコマンドを記述します。 、注意しないとデータが失われる可能性があります。
作成と選択
3番目の変換手法は、1番目のメカニズムの速度と2番目のメカニズムの安全性の間の妥協です。次のように、テーブル全体をダンプしたり、一度にすべて変換したりするのではなく、新しいテーブルを作成し、MySQLのINSERT ... SELECT構文を使用してデータを設定します。
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
データが足りない場合はこれでうまくいきますが、データが多い場合は、多くの場合、テーブルを段階的に追加し、各チャンク間でトランザクションをコミットする方が効率的です。これにより、元に戻すログが大きくなりません。idが主キーであると想定して、すべてのデータを新しいテーブルにコピーするまで、このクエリを繰り返し実行します(毎回xとyの値を大きくします)。
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;
これを実行すると、元のテーブル(作業が終わったらドロップできる)と、完全にデータが追加された新しいテーブルが残ります。データの一貫性のないコピーを取得しないようにする必要がある場合は、元のテーブルをロックするように注意してください!