大きなテーブルをMyISAMからInnodbに変換する


9

MyISAM形式で約3億行のテーブルがあり、Innodbに変換したい

私の最初の目標は、テーブルスキーマを変更してインデックスを単純にすることで使用量を減らすことでした。すべてのテーブルをダンプして削除し、インデックスを減らして再作成しましたが、今は再インポートしています。ただし、myisamではなくinnodbであることを指定するのを忘れていました。

標準のALTER TABLE ... ENGINE = INNODBを実行できますか?このような巨大なテーブルで知っておくべき特別なことはありますか?

データのインポート操作には約12時間かかります-やり直したくありません。したがって、なぜそれを変換したいのか。


行が300Mの場合、MyISAMはおそらくそのサイズのテーブルに、より高速で適切です。
マークヘンダーソン

回答:


14

次の抜粋は、本「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;

これを実行すると、元のテーブル(作業が終わったらドロップできる)と、完全にデータが追加された新しいテーブルが残ります。データの一貫性のないコピーを取得しないようにする必要がある場合は、元のテーブルをロックするように注意してください!


2

ALTER TABLEステートメントは基本的に同じことを行います。サーバーは一時テーブルを作成し、すべての行をコピーしてからRENAMEを実行します。ディスク上のフォーマットはInnoDBとMyISAMの間で非常に異なるため、これへのショートカットを見つけることは期待していません。

もう1つの注釈(ご存知かもしれませんが、他の人がこれを読むのに役立ちます):InnoDBのディスク上フォーマットは、主キーに基づいてレコードをクラスター化するため、主キーに大きく依存しています。したがって、大きなInnoDBテーブルを使用する場合は、主キーを選択する前によく考えてください。変更すると、当面の問題と同様に、テーブル全体が再構築されます。

とにかく、まずは適度なサイズのテーブルでいくつかのテストを行い、それらの時間を測定することをお勧めします。


2
MySQLのテーブル変更操作(およびインデックスの追加を含む)により、テーブルが再構築されます。
David Pashley、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.