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

推薦する

Vite2.0の落とし穴

目次Viteプロジェクトビルドの最適化他のやっとこれは前回の記事の補足です。設定プロジェクトで遭遇し...

n 個のコンテナ要素による無限スクロールの実装コード

シナリオ最大 10000 要素のリストを正しくレンダリングする方法。無限ドロップダウン読み込みテクノ...

JavaScriptのイベントループの仕組みの分析

目次序文: 1. イベント ループとタスク キューの理由: 2. イベントループメカニズム: 3. ...

アクティビティページでの CSS3 アニメーション効果の適用

背景あっという間に忙しい一年が終わり、毎年恒例のイベントの時期がやってきます。お祭り気分を演出するに...

ネイティブ JavaScript メッセージボード

この記事では、参考までにメッセージボードを実装するためのJavaScriptの具体的なコードを紹介し...

JavaScript が重複したネットワークリクエストを防ぐ方法の例

序文開発中は、インターフェース要求の繰り返しによってさまざまな問題が発生することがよくあります。ネッ...

Docker ケース分析: MySQL データベース サービスの構築

目次1 設定ディレクトリとデータディレクトリを作成する3 イメージからホストに構成ファイルをコピーす...

ウェブサイトのフロントエンドパフォーマンスの最適化: JavaScript と CSS

Yahoo チームが書いた、ウェブサイトのパフォーマンス最適化に関する記事を読みました。この記事は...

Python ベースの Linux システムにおける特定のプロセスのパフォーマンス監視の考え方の詳細な説明

インターネット上には Linux サーバーを監視するためのツール、コンポーネント、プログラムが多数あ...

アップロード画像コントロールを実現するネイティブ js

この記事の例では、アップロード画像コントロールを実装するためのjsの具体的なコードを参考までに共有し...

ページデザインにおけるテーブルとdivの適切な適用についての簡単な説明

この記事の冒頭で、以前書いた入門記事の間違いを訂正したいと思います。初心者を再び誤解させないように、...

JavaScript配列の一般的なメソッドの概要

目次1. はじめに2. フィルター() 3. マップ() 4. ソート() 5. 減らす() 6. ...

Linux teeコマンドの使い方の詳しい説明

teeコマンドは主にstandout(標準出力ストリーム、通常はコマンド実行ウィンドウ)に出力し、同...

MacOS での MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル

この記事では、MacOSでのMySQL 8.0.18のインストールと成功したコマンドライン操作を記録...