MySQL 8.0 で列を素早く追加する方法

MySQL 8.0 で列を素早く追加する方法

序文:

MySQL 8.0 では高速な列追加がサポートされ、数秒で大きなテーブルにフィールドを追加できるようになったと、かなり前に聞きました。著者もローカルに 8.0 環境を持っていますが、テストはしていません。この記事では、MySQL 8.0 で列をすばやく追加する方法を説明します。

1. 背景情報を理解する

テーブル構造の変更は、ビジネス運用プロセスで最も一般的な要件の 1 つです。MySQL 環境では、Alter ステートメントを使用してこれらの操作を完了できます。これらの Alter ステートメントに対応する操作は、通常、DDL 操作とも呼ばれます。一般的に、大規模なテーブルに対する DDL 操作はビジネスに大きな影響を与えるため、ビジネスがアイドル状態またはメンテナンス中に実行する必要があります。 MySQL 5.7 はオンライン DDL をサポートしています。ほとんどの DDL はテーブルの読み取りと書き込みには影響しませんが、それでも多くの時間を消費し、追加のディスク領域を占有し、マスターとスレーブ間の遅延を引き起こします。したがって、大規模なテーブルの DDL は、依然として DBA にとって頭痛の種です。

MySQL 8.0 では DBA のこの悩みが解決されると聞いたので、詳しく見てみましょう。新しい機能について学ぶ最も簡単な方法は、公式ドキュメントを参照することです。公式ドキュメントによると、Instant Add Column 機能は MySQL 8.0.12 で導入され、Tencent Games DBA チームによって提供されました。この機能は InnoDB テーブルでのみ使用できることに注意してください。

2. クイック列追加テスト

クイック列追加ではインスタント アルゴリズムが使用されるため、列を追加するときにテーブル全体を再構築する必要はありません。新しい列の基本情報をテーブル メタデータに記録するだけで済みます。 alter ステートメントの後に ALGORITHM=INSTANT を追加すると、インスタント アルゴリズムが使用されます。明示的に指定されていない場合は、インスタント アルゴリズムをサポートする操作がデフォルトで使用されます。 ALGORITHM=INSTANT が指定されているがサポートされていない場合、操作はエラーで直ちに失敗します。

列の DDL 操作に関しては、instant などのアルゴリズムがサポートされているかどうか、公式ドキュメントに表が示されており、現在は次のように整理されています。アスタリスクは、すべてがサポートされているわけではなく、依存関係があることを示します。

操作するインスタント所定の場所テーブルを再構築する同時DMLを許可するメタデータのみを変更する
列を追加するはい*はいいいえ*はい*いいえ
列の削除いいえはいはいはいいいえ
列の名前を変更するいいえはいいいえはい*はい
列の順序を変更するいいえはいはいはいいいえ
列のデフォルト値の設定はいはいいいえはいはい
列のデータ型の変更いいえいいえはいいいえいいえ
VARCHAR 列サイズの拡張いいえはいいいえはいはい
列のデフォルト値を削除するはいはいいいえはいはい
自動増分値の変更いいえはいいいえはいいいえ*
列をnullに設定するいいえはいはい*はいいいえ
列をnull以外に設定するいいえはい*はい*はいいいえ
ENUM/SET列の定義を変更するはいはいいいえはいはい

最も広く使用されているインスタント アルゴリズムは、列を追加することです。ご覧のとおり、このアルゴリズムを使用する場合はいくつかの制限があります。制限の一部は次のとおりです。

  • ALTER ステートメントに列の追加やその他の操作が含まれており、操作の 1 つがインスタント アルゴリズムをサポートしていない場合、ALTER ステートメントはエラーを報告し、すべての操作は実行されません。
  • 列は順番にのみ追加できます。列の追加では、末尾への列の追加のみがサポートされ、既存の列の途中への列の追加はサポートされません。
  • 圧縮されたテーブルはサポートされていません。つまり、テーブル行の形式を圧縮することはできません。
  • フルテキスト インデックスを含むテーブルはサポートされていません。
  • 一時テーブルはサポートされていません。
  • データ ディクショナリ テーブルスペースに作成されたテーブルはサポートされていません。

これ以上言うよりも実際にテストしてみるのが良いでしょう。バージョン 8.0.19 を例に、実際に検証してみましょう。

# sysbench を使用して 1000 万ワットのテーブルを生成しますmysql> select version();
+-----------+
| バージョン() |
+-----------+
| 8.0.19 |
+-----------+
セット内の 1 行 (0.00 秒)

mysql> sbtest1 から count(*) を選択します。
+----------+
| カウント(*) |
+----------+
| 10000000 |
+----------+

# デフォルト値のない列を追加しますmysql> alter table sbtest1 add column col1 varchar(20), algorithm=instant;
クエリは正常、影響を受けた行は 0 行 (0.63 秒)
レコード: 0 重複: 0 警告: 0

# デフォルト値を持つ列を追加します。 mysql> alter table sbtest1 add column create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'creation time', algorithm=instant;
クエリは正常、影響を受けた行は 0 行 (0.58 秒)
レコード: 0 重複: 0 警告: 0

# インスタントアルゴリズムを明示的に指定しないでください。mysql> alter table sbtest1 add column col2 varchar(20);
クエリは正常、影響を受けた行は 0 行 (0.55 秒)
レコード: 0 重複: 0 警告: 0

# 列のデフォルト値を設定します。mysql> alter table sbtest1 alter column col1 set default 'sql',algorithm=instant;
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
レコード: 0 重複: 0 警告: 0

# 列を追加するためのインプレースアルゴリズムを指定します(このアルゴリズムはバージョン5.7で使用されます)
mysql> テーブル sbtest1 を変更し、列 col_inplace varchar(20),algorithm=inplace; を追加します。
クエリは正常、影響を受けた行は 0 行 (1 分 23.30 秒)
レコード: 0 重複: 0 警告: 0

上記のテストから、インスタント アルゴリズムを使用した列の追加は基本的に 1 秒以内に完了することがわかります。大きなテーブルの場合、この速度は非常に速く、ビジネスでは基本的に気になりません。バージョン 5.7 でインプレース アルゴリズムを使用する場合、列の追加にかかる時間は数分にまで長くなります。それに比べると、バージョン 8.0 のクイック列追加機能は実に実用的です。

要約:

列をすばやく追加するにはいくつかの制限があり、インスタント アルゴリズムは一部の DDL 操作にのみ適用されますが、8.0 のこの新機能は非常に魅力的であり、大規模なテーブルにフィールドを追加する際の問題を大幅に解決します。この記事を通じて、この新機能について理解していただければ幸いです。8.0 にアップグレードしたい場合は、正確に実行を開始できます。

上記は、MySQL 8.0 で列をすばやく追加する方法の詳細です。MySQL 8.0 で列をすばやく追加する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLオンラインDDLの使用に関する詳細な説明
  • MySQL DDL による同期遅延を解決する方法
  • MySQL 8.0 アトミック DDL 構文の詳細な説明
  • MySQL オンライン DDL ツール gh-ost 原理分析
  • MySQL DDLステートメントの使用
  • 一般的なMysql DDL操作の概要
  • MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL
  • MySQL データ定義言語 DDL の基本ステートメント
  • MySQL 8.0 DDLアトミック機能と実装原則
  • MySQLオンラインDDL gh-ostの使用の概要
  • MySQL 5.7 でブロックポジショニング DDL の問題を解決する
  • MySQL 8.0 の新機能: アトミック DDL ステートメントのサポート
  • MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開
  • MySQL 8.0 オンライン DDL クイック列追加の概要

<<:  Linux userdel コマンドの使用法

>>:  JSにおける合同と不等式、等式と不等式の問題について

推薦する

Vue3 における親コンポーネントと子コンポーネント間の値の転送の詳細な説明

vue3 が誕生してからかなり時間が経ち、筆者も最近になって vue3 を学び始めました。 vue2...

Vue のルータールーティングの 2 つのモード (ハッシュと履歴) の詳細な説明

ハッシュモード(デフォルト)動作原理:ウェブページのハッシュ値の変化を監視する—> onhas...

ミニプログラムはミニプログラムクラウドを使用してWeChatの支払い機能を実装します

目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....

Linux 面接で最もよく聞かれる 10 の質問のまとめ

序文Linux システムの運用および保守エンジニア職の面接を受ける場合は、次の 10 個の最も一般的...

Mybatis ファジークエリ実装方法

Mybatis ファジークエリ実装方法mybatis のリバース アシスタントは非常に使いやすく、通...

JavaScript を使用してソートアルゴリズムを実装する方法

目次バブルソート選択ソート挿入ソート要約するバブルソートバブルソートは、シーケンスの右側から始めて、...

Dockerコンテナのディスクがいっぱいになった場合の状況のまとめ

序文この記事では、最近私が遭遇した 2 つの状況について説明します。今後、新たな発見があれば追加して...

HTMLはテキスト行のインターセプトの実装原理とコードを超えています

複数行を超えるテキストをインターセプトするための HTML コードは次のとおりです。 HTML:コー...

Linux CentOS でスクリプトを定期的に実行するように設定する方法

多くの場合、サーバーでスクリプトを定期的に実行して操作をトリガーする必要があります。たとえば、Qin...

MySQL グリーン解凍バージョンのインストールと設定手順

手順: 1. MySQLデータベースをインストールする1. MySQL-5.6.17-winx64....

Dockerで構築されたコンテナにpingツールをインストールする

Centos や Ubuntu など、Docker が pull する Base イメージは最もシン...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

MySQLが数十億のトラフィックをサポートする方法

目次1 マスター・スレーブの読み取り・書き込み分離1.1 コア2 マスタースレーブレプリケーション2...

Mysql の主キーと一意キーの違いのまとめ

主キーとは何ですか?主キーは、テーブル内の各タプル (行) を一意に識別するテーブル内の列です。主キ...