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における合同と不等式、等式と不等式の問題について

推薦する

マークアップ言語 - タイトル

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

MySQLにおけるテーブルインデックスの定義方法と導入

概要インデックスは、テーブル内の 1 つ以上の列に基づいて DBMS によって特定の順序で作成される...

VueにExcelテーブルプラグインを導入する方法

この記事では、Excelテーブルプラグインを導入するVueの具体的なコードを参考までに共有します。具...

MacにMySQLをインストールするときに忘れたパスワードを変更する方法

1. MacにMySQLデータベースをインストールする1. MySQLデータベースをダウンロードする...

CSS3のfocus-withinセレクタの使用

擬似要素と擬似クラスところで、まずは疑似クラスセレクターと疑似要素セレクターについておさらいしておき...

Oracle の開閉の 4 つのモード

>1 データベースを起動するcmd コマンド ウィンドウで、「sqlplus」を直接入力して ...

nginx で仮想ホストを構成するための詳細な手順

仮想ホストは、インターネット上で実行されているサーバー ホストを複数の「仮想」ホストに分割する特殊な...

node.js が大規模プロジェクトに適さない理由

目次序文1. アプリケーションコンポーネント2. アプリケーションの種類3. アプリケーションサービ...

デザインリファレンス 美しく独創的なブログデザイン

以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...

Zabbixは複数のmysqlプロセスの監視を実装します

1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?

序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...

IDEA2020.1.2 Webプロジェクトの作成とTomcatの設定に関する詳細なチュートリアル

この記事は、IDEA で Web プロジェクトを作成し、Tomcat を構成する方法についての統合記...

MySQL 接続例外とエラー 10061 の解決方法

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...