約35列と2つのインデックスを持つ170,002,225行のテーブルがあります。列を追加したい。 alter tableコマンドには約10時間かかりました。その間、プロセッサはビジーに見えず、過度のIO待機はありませんでした。これは、大量のメモリを備えた4ウェイの高性能ボックスです。
これは私ができる最善ですか? dbのチューニングでadd列を最適化するために検討できることはありますか?
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;
MySQLマニュアルには次の注意事項があるので、最新のPercona MySQLビルドプラスを使用することをお勧めします。
それ以外の場合、データを厳密にコピーする必要がない場合でも、MySQLは一時テーブルを作成します。 MyISAMテーブルの場合、myisam_sort_buffer_sizeシステム変数を高い値に設定することにより、インデックス再作成操作(変更プロセスの最も遅い部分)を高速化できます。
できるよ ALTER TABLE DISABLE KEYS
最初に列を追加してからALTER TABLE ENABLE KEYS
。ここでできることは何もありません。
ところで、MongoDBに行くことはできませんか?列を追加しても何も再構築されません。
インデックスを作成するのに最も時間がかかるのは、テーブルを変更する前にインデックスを削除できるからでしょうか?