web-dev-qa-db-ja.com

alter table add columnのためにmySqlを最適化する

約35列と2つのインデックスを持つ170,002,225行のテーブルがあります。列を追加したい。 alter tableコマンドには約10時間かかりました。その間、プロセッサはビジーに見えず、過度のIO待機はありませんでした。これは、大量のメモリを備えた4ウェイの高性能ボックスです。

これは私ができる最善ですか? dbのチューニングでadd列を最適化するために検討できることはありますか?

50
Andrew

ALTER TABLEは、MySQLで実際に新しいスキーマで新しいテーブルを作成してから、すべてのデータを再INSERTし、古いテーブルを削除します。新しいテーブルを作成し、データをロードしてからテーブルの名前を変更すると、時間を節約できます。

「高性能MySQLブック」(percona guys)から:

MyISAMテーブルを効率的にロードするための通常のトリックは、キーを無効にし、データをロードし、キーを取得することです。

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;
6
FoneyOp

MySQLマニュアルには次の注意事項があるので、最新のPercona MySQLビルドプラスを使用することをお勧めします。

それ以外の場合、データを厳密にコピーする必要がない場合でも、MySQLは一時テーブルを作成します。 MyISAMテーブルの場合、myisam_sort_buffer_sizeシステム変数を高い値に設定することにより、インデックス再作成操作(変更プロセスの最も遅い部分)を高速化できます。

できるよ ALTER TABLE DISABLE KEYS最初に列を追加してからALTER TABLE ENABLE KEYS。ここでできることは何もありません。

ところで、MongoDBに行くことはできませんか?列を追加しても何も再構築されません。

3

インデックスを作成するのに最も時間がかかるのは、テーブルを変更する前にインデックスを削除できるからでしょうか?

3
Gigamegs