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 エラー: 接続数が多すぎる場合の解決策

MySQLデータベースの接続が多すぎますこのエラーは明らかに、mysql_connect の後に m...

ARM64アーキテクチャでmysql5.7.22をインストールするプロセス全体

MySQLダウンロードアドレス: https://obs.cn-north-4.myhuaweicl...

Nginx タイムアウト設定の詳細な説明

最近、プロジェクトで nginx を使用し、バックエンドで Java を使用しました。バックエンドで...

grep を使用して MySQL エラー ログ情報を取得する方法の詳細な説明

MySQL のメンテナンスを容易にするために、エラー情報を収集するためのインターフェースを提供するス...

Ubuntu環境でPHPとNginxをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で PHP と Nginx をコンパイルしてインストールする方法につ...

モバイル アプリのユーザー インターフェース設計に関する 10 のヒント

ヒント1: 集中力を保つ最高のモバイル アプリは、1 つのことを非常にうまく行うことに重点を置いてい...

node.jsのコアモジュールとは

目次グローバルオブジェクトグローバルオブジェクトとグローバル変数プロセスコンソール一般的なツールユー...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

MySQL シリーズ 11 ログ

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...

Chromeの最小フォントサイズ制限12pxに対する最終的な解決策

ウェブサイトを作成するユーザーの多くが、このような問題に遭遇すると思います。Chrome のデフォル...

CSS で雨滴アニメーション効果を実装するサンプルコード

ガラス窓今日実現するのは雨滴効果です。ただし、雨滴効果を実現する前に、まずは曇りガラス効果を作成しま...

dockerでredis5.0.3をインストールする方法

1. 公式5.0.3イメージを取得する [root@localhost ~]# docker pul...

vue-cli の紹介とインストール

目次1. はじめに2. vue-cli の紹介2.1 コマンドライン2.2 CLI サービス2.3 ...

Linux で gdb を使用してコア ファイルをデバッグする方法

1.コアファイルプログラム実行中にセグメンテーション エラー (コア ダンプ) が発生すると、プログ...

CentOS サーバーのセキュリティ構成戦略

最近、ブルートフォース攻撃によるサーバのクラッキングが頻発しています。侵入行為を大まかに分析し、よく...