Mysql ALTER TABLE はフィールドを追加するときにテーブルをロックしますか?

Mysql ALTER TABLE はフィールドを追加するときにテーブルをロックしますか?

MySQL 5.6以前

更新手順

  • 元のテーブルに書き込みロックを追加する
  • 元のテーブルの定義と実行ステートメントに従って、空の一時テーブルを再定義します。
  • 一時テーブルにインデックスを追加します (存在する場合)。
  • 次に、元のテーブルのデータを 1 つずつ一時テーブルにコピーします。
  • 元のテーブルのすべてのレコードが一時テーブルにコピーされた後、元のテーブルは削除されます。次に、一時テーブルの名前を元のテーブル名に変更します。
  • この場合、DDL プロセス全体がテーブルをロックします。

MySQL 5.6以降

更新手順

  • 元のテーブルに書き込みロックを追加する
  • 元のテーブルの定義と実行ステートメントに従って、空の一時テーブルを再定義します。そして、rowlog スペースを申請します。
  • 元のテーブル データを一時テーブルにコピーします。この時点で、すべてのテーブル データ変更操作 (追加、削除、変更) が行ログに保存されます。このとき、クライアントはテーブルを操作できます。
  • 元のテーブル データがすべてコピーされた後、行ログ内のすべての変更が一時テーブルに同期されます。このプロセス中はクライアントは操作できません。
  • 元のテーブルのすべてのレコードが一時テーブルにコピーされると、コピー期間中のクライアントのすべての追加、削除、および変更操作が一時テーブルに同期されます。次に、一時テーブルの名前を元のテーブル名に変更します。

要約する

ALTER TABLE で列を追加すると、その列がロックされます。ただし、MySQL バージョン 5.6 以降では ONLINE DDL 機能が追加され、テーブルが使用できない時間が大幅に短縮されました。

知らせ

ALTER TABLE にフィールドを追加する場合。テーブル内のデータ量が非常に大きい場合。デフォルト値を設定しないでください。
たとえば、現在 2,000 万を超えるデータ量を持つテーブルが存在します。フィールドを追加する場合は、デフォルト値を追加します。オンラインDDLを実行すると、Mysqlはテーブルデータ全体のデフォルト値を更新します。つまり、

UPDATE `table_name` SET new_col = [デフォルト値] WHERE TRUE

これは、同じトランザクションで 2000w 以上のデータを更新することと同じです。つまり、このトランザクションはテーブル全体をロックし、すべてのデータ レコードがデフォルト値で更新されるまでコミットされません。

この時間は非常に長く、テーブル内のすべてのレコードがロックされているため、テーブルは非常に長い間使用できなくなります。

著者は、16 コア、32G、Mysql のデフォルト構成で実験しました。 500 万のデータと 1 つのフィールド。

デフォルト値がない場合、DDL 更新プロセス全体には 66 秒かかります。さらに、更新プロセス全体を通じて、テーブルのクエリ、変更、および追加の操作が可能です。テーブルの使用性にはほとんど影響はありません。

デフォルト値では、DDL 更新プロセス全体に 213 秒かかります。テストの結果、約 100 秒後に、テーブルのクエリ、変更、および追加操作が待機状態になることがわかりました。

これで、Mysql ALTER TABLE でフィールドを追加するときにテーブルをロックするかどうかについてのこの記事は終了です。Mysql ALTER TABLE でフィールドを追加することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL のテーブル変更コマンドの詳細な紹介
  • mysql テーブル変更テーブルコマンドの概要
  • テーブル構造を変更するmysql alter tableコマンドの例
  • テーブル構造を変更するmysql alter tableコマンドの詳細な説明
  • MySQL の alter table コマンドの基本的な使用法と速度の最適化
  • MySQL 学習ノート 5: テーブルの変更 (alter table)

<<:  iOS スタイルの選択ボックスの開閉機能を実装するための純粋な CSS

>>:  CSS でデジタル ページング効果のコードと手順を実装する方法

推薦する

Mysql-connector-java ドライバのバージョン問題の概要

Mysql-connector-java ドライバのバージョンの問題私のデータベースのバージョンは ...

MySQL分離の使用手順を読む

現在のトランザクションはどの履歴バージョンを読み取ることができますか?読み取りビューは、トランザクシ...

MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック

MySQL データベースの実行効率はプログラムの実行速度に大きな影響を与えます。データベースの効率的...

HTML でのアンカーポイントの適用

アンカーポイントの設定<a name="トップ"></a>...

ウェブサイトにダークモード切り替え機能を持たせるための純粋なCSSフリー実装コード

序文ダーク モードの概念は、 MacOS系統のMojaveに由来し、ユーザーが選択できる 2 つのス...

Dockerfileを使用してApacheイメージを作成する方法

目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...

Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...

MySQL サービスとデータベース管理

目次1. サービスの開始と停止の手順1.1 Windows での MySQL 5.7 の公式 MSI...

IDEA2021 tomcat10 サーブレットの新しいバージョンの落とし穴

私が学習していたときに使用していたバージョンは比較的新しいものであり、インターネット上のチュートリア...

見落とされがちなMETAタグの特殊効果(ページ遷移効果)

Web デザインで js を使用すると、多くのページ効果を実現できますが、HTML タグの META...

フレックスレイアウトのスペース間の最後の行の左揃えの問題を解決する方法

まずはコードと効果を見てみましょう↓ <スタイル> 。主要 { アウトライン: 1px ...

Bootstrap 3.0 学習ノートのページレイアウト

今回はレイアウトを中心に学習しますが、これは基本的なHTMLタグのほとんどにも存在するため、比較的簡...

CSS3 はドラッグ可能なルービックキューブの 3D 効果を実現します

主に使用される知識ポイント: •css3 3D変換 •ネイティブjsマウスドラッグイベント•表示:グ...

tinyMCEの使い方と体験の詳細な説明

tinyMCE の使用方法の詳細な説明初期化TinyMCE を初期化するときは、ページの HEAD ...

react setStateの詳細な説明

目次setState は同期ですか、それとも非同期ですか?カスタム合成イベントと React フック...