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

推薦する

Centos8 でローカル Web サーバーを構築するための実装手順

1 概要システム Centos8 では、httpd を使用してローカル Web サーバーを構築します...

MySQLがサブクエリと結合の使用を推奨しない理由

ページ分割されたクエリを実行するには: 1. MySQL の場合、サブクエリと結合の使用は推奨されま...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

純粋な CSS3 でペットの鶏のサンプルコードを実現

最近、CSS3に関する知識や記事をたくさん読んできましたが、CSS3はとても便利に使えると思います。...

ミニプログラムはリストのカウントダウン機能を実装します

この記事の例では、ミニプログラムでリストカウントダウンを実装するための具体的なコードを参考までに共有...

MySQL 最適化: キャッシュ最適化

何人かのブロガーが私の記事を評価してくれたのは嬉しいです。マークと知り合ってからは、私は彼をフォロー...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

Linux で MySQL データベースのインポートおよびエクスポート コマンドを実装する方法

1. mysqldump コマンドを使用してデータベースをエクスポートします (このコマンドのパスで...

マークアップ言語 - CSS レイアウト

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

基礎知識: ウェブサイトのアドレスの前の http はどういう意味ですか?

HTTPとは何ですか?ウェブサイトを閲覧したいときは、ブラウザのアドレス バーにウェブサイトのアド...

Windowsタイムサーバーの設定方法の詳しい説明

最近、会社のサーバーの時間が不正確で、外部の時間ソースと同期できないことがわかりました。会社はドメイ...

Antd+vueは円形属性フォームの動的検証のアイデアを実現します

必要な項目をループして検証するために、クエリ フォームのいくつかのプロパティを実装したいと考えていま...

JavaScript 関数の高度な説明

目次関数定義方法関数呼び出し(6種類)これは問題を指摘している厳密モード高階関数閉鎖再帰: 自分自身...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...