約 35 列と 2 つのインデックスを持つ 170,002,225 行のテーブルがあります。列を追加したい。alter table コマンドには約 10 時間かかりました。その間、プロセッサはビジーではなく、過度の IO 待機もありませんでした。これは、大量のメモリを備えた 4 ウェイの高性能ボックスにあります。
これは私ができる最善のことですか?データベースのチューニングで追加列を最適化するために調べることができるものはありますか?
約 35 列と 2 つのインデックスを持つ 170,002,225 行のテーブルがあります。列を追加したい。alter table コマンドには約 10 時間かかりました。その間、プロセッサはビジーではなく、過度の IO 待機もありませんでした。これは、大量のメモリを備えた 4 ウェイの高性能ボックスにあります。
これは私ができる最善のことですか?データベースのチューニングで追加列を最適化するために調べることができるものはありますか?
私は過去に非常によく似た状況に直面し、この方法で操作のパフォーマンスを改善しました:
INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
ALTER TABLE
MySQL では、実際には新しいスキーマで新しいテーブルを作成し、データをすべて再INSERT
格納して古いテーブルを削除します。新しいテーブルを作成し、データをロードしてからテーブルの名前を変更すると、時間を節約できます。
「High Performance MySQL book」(percona 関係者) から:
MyISAM テーブルを効率的にロードするための通常のトリックは、キーを無効にし、データをロードして、キーを腎することです。
mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;
さて、MySQL のマニュアルに次の注記があるので、最新の Percona MySQL build plus を使用することをお勧めします。
それ以外の場合、データを厳密にコピーする必要がない場合でも、MySQL は一時テーブルを作成します。MyISAM テーブルの場合、myisam_sort_buffer_size システム変数を高い値に設定することで、インデックスの再作成操作 (変更プロセスの中で最も遅い部分) を高速化できます。
最初に実行してALTER TABLE DISABLE KEYS
から、列を追加してからALTER TABLE ENABLE KEYS
. ここでできることは何もありません。
ところで、MongoDB に行けませんか? 列を追加しても何も再構築されません。
作成に最も時間がかかるのはインデックスであるため、テーブルを変更する前にインデックスを削除できますか?