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 でデジタル ページング効果のコードと手順を実装する方法

推薦する

クラスタrpmを使用してMySQLをインストールするための詳細な手順

MySQLデータベースをインストールするa) MySQL ソースインストールパッケージをダウンロード...

MySQL テーブルがロックされているかどうかを照会する方法

具体的な方法: (推奨チュートリアル:MySQLデータベース学習チュートリアル)テーブルロックの状態...

Xshell にショートカット コマンドを追加する方法

便利なターミナル エミュレーターである Xshell は、開発者がホスト サーバーをリモート管理する...

Vue3 でモバイル ログインおよび登録モジュールをエレガントに実装する方法

目次序文入力ボックスコンポーネントレイアウトvモデルデータ検証ルール設計形状サブコンポーネントは検証...

数百万のデータボリュームに対する MySQL ページングクエリ方法とその最適化の提案

データベース SQL の最適化はよくある問題です。何百万ものデータ ボリュームに対してページング ク...

MySQL データベースは XA 仕様をどのように実装しますか?

MySQL 一貫性ログMySQL データベースの電源が切れた場合、コミットされていないトランザクシ...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

最もよく使われるHTMLエスケープシーケンス

HTML では、<、>、& などは特別な意味を持ち (<、> はリン...

オンデマンドで Vue コンポーネントを自動的にインポートする方法

目次グローバル登録部分登録ローカル自動登録さまざまなソリューションの比較コンポーネント名について参照...

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

InnoDB テーブルの BLOB 列と TEXT 列のストレージ効率を最適化します。

まず、MySQL InnoDB エンジンのストレージ形式に関する重要なポイントをいくつか紹介します。...

MySQLテーブルをコピーする方法

目次1.mysqlダンプ実行プロセス:特徴2. CSVファイルをエクスポートする(最も柔軟性が高い)...

JavaScript でツリー構造を構築するための効率的なアルゴリズムについての簡単な説明

目次導入アイデアID配列インデックスのマッピング関係を確立するツリー構造の構築原理要約する導入組織階...

Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法

Node.js環境でテストが通っています。他の言語でも同様です。環境変数を取得する方法を使うだけです...

Linux でファイルの種類を理解して識別する方法

序文ご存知のとおり、Linux ではハードディスクやグラフィック カードなどすべてがファイルです。 ...