1

ALTER TABLE1,000 万行のテーブルがあり、別の列 (a) を追加しようとしていますVARCHAR(80)

データ モデリングの観点からは、その列はNOT NULL- である必要がありますが、ステートメントの実行にかかる時間は考慮事項であり、NULLそれが保証されている場合は列を処理するようにクライアント コードを変更できます。

NULL追加しようとしている列の能力は、どちらの方法でも列を追加するのにかかる時間に大きな影響を与えるべきですか?

詳しくは

私がこれを行っているコンテキストは、South によって生成された移行を伴う Django アプリです - 3 つの個別の列を追加し、新しく追加された列の 1 つにインデックスを追加します。South で生成された SQL を見ると、この操作 (3 つの列とインデックスの追加) が 15 のALTER TABLEステートメントに分散されています。

InnoDB は実際にはディスク上のファイルに null 許容フィールドのフィールドを作成する必要はなくNULL、ヘッダーのビットフィールドを変更するだけであることを示唆する参考文献を見てきました。これは操作の速度に影響しALTER TABLEますか?

4

1 に答える 1

2

列のnull可能性は、の速度とは何の関係もないと思いますALTER TABLE。ほとんどのテーブル変更操作では、テーブル全体(すべてのインデックスを含む)を(一時的に)コピーする必要があり、その後、コピーに対して変更が行われます。1000万行の場合、少し時間がかかります。MySQLドキュメントから:

ストレージ、パフォーマンス、および同時実行性に関する考慮事項

ほとんどの場合、ALTER TABLE元のテーブルの一時的なコピーを作成します。MySQLは、テーブルを変更している他の操作を待ってから続行します。変更をコピーに組み込み、元のテーブルを削除し、新しいテーブルの名前を変更します。の実行中ALTER TABLE、元のテーブルは他のセッションで読み取ることができます。操作の開始後に開始されたテーブルへの更新と書き込みはALTER TABLE、新しいテーブルの準備ができるまで停止され、更新が失敗することなく自動的に新しいテーブルにリダイレクトされます。一時テーブルは、新しいテーブルのデータベースディレクトリに作成されます。これは、テーブルの名前を別のデータベースに変更する操作の場合、元のテーブルのデータベースディレクトリとは異なる場合がありALTER TABLEます。


テーブルの構造に複数の変更を加えたい場合は、通常、1回のALTER TABLE操作で変更することをお勧めします。


クライアントコードがテーブルに変更を加えることを許可することはおそらく最善のアイデアではありません-そしてあなたはそれを許可しない1つの正当な理由にぶつかりました。なぜあなたはそれが必要なのですか?それ以外の方法で実行できない場合は、パフォーマンス上の理由から、列を追加するのではなく、クライアントコードで(新しい列と既存のテーブルのPKを使用して)テーブルを作成できるようにする方がよいでしょう。

于 2012-04-04T22:47:33.997 に答える