52

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

これは私ができる最善のことですか?データベースのチューニングで追加列を最適化するために調べることができるものはありますか?

4

5 に答える 5

39

私は過去に非常によく似た状況に直面し、この方法で操作のパフォーマンスを改善しました:

  1. 新しい列を含めて (現在のテーブルの構造を使用して) 新しいテーブルを作成します。
  2. 実行するINSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  3. 現在のテーブルの名前を変更する
  4. 現在のテーブルの名前を使用して、新しいテーブルの名前を変更します。
于 2011-04-15T14:15:21.290 に答える
7

ALTER TABLEMySQL では、実際には新しいスキーマで新しいテーブルを作成し、データをすべて再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;
于 2011-04-15T17:25:23.407 に答える
4

さて、MySQL のマニュアルに次の注記があるので、最新の Percona MySQL build plus を使用することをお勧めします。

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

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

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

于 2011-04-15T15:04:12.463 に答える
3

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

于 2011-04-15T14:10:27.443 に答える