MySQL 8.0はどのように快速に列を追加しますか?


前言:
早くもMySQL 8.0がクイックカラムに対応していると聞きましたが、大きなテーブル秒フィールドが実現できます。筆者は地元でも8.0の環境がありますが、テストは行われていません。この文章は私たちと一緒にMySQL 8.0の快速列の操作を見に来ました。
1.背景情報を知る
表構造の変更は、業務運行中によく見られる需要の一つであり、MySQLの環境においては、Alter文を使用してこれらの操作を完了することができ、これらのAlter文に対応する操作は通常DDL操作と呼ばれる。通常、大きな時計のDDL操作は業務に大きな影響を与え、業務の空き時間やメンテナンス時に行う必要があります。MySQL 5.7はOnline DDLをサポートしています。ほとんどのDDLは表の読み取りと書き込みに影響を与えません。しかし、依然として非常に多くの時間を消費し、ディスク空間を占有し、主従遅延をもたらします。だから、大きい時計のDDLはまだDBAを頭が痛いです。
MySQL 8.0がDBAの頭痛を解決したと聞きましたが、詳しく調べてみましょう。新しい機能を知りたいです。一番簡単な方法は公式文書を見ることです。公式文書を見て、快速に列を加えるとInstant Add Columnとなり、この機能はMySQL 8.0.12バージョンから導入され、テンセントゲームDBAチームによって貢献されていることが分かりました。注意してください。この機能はInnoDB表だけに適用されます。
2.快速列テスト
クイックカラムはinstantアルゴリズムを採用しています。列を追加する際には、rebuild全体のテーブルは必要なく、テーブルのmetadataに新規カラムの基本情報を記録するだけでいいです。ALGORITHM=INSTANTを追加するとinstantアルゴリズムを使用することになりますが、明示的に指定されていない場合はinstantアルゴリズムの操作はデフォルトで使用されます。ALGORITHM=INSTANTが指定していますが、サポートされていない場合、すぐに操作が失敗してエラーが表示されます。
列のDDLの操作については、instantなどのアルゴリズムがサポートされているかどうか、公式文書に表が与えられていますが、以下のように整理されています。星番号はすべてのサポートではなく、依存項があります。
操作
インスト
In Place
Rebuilds Table
同時にDMMを許可する
メタデータのみを変更
列を追加
はい*
はい
No*
はい*
No.
列を削除
No.
はい
はい
はい
No.
列の名前を変更
No.
はい
No.
はい*
はい
列の順序を変更
No.
はい
はい
はい
No.
列のデフォルトを設定
はい
はい
No.
はい
はい
列データの種類を変更
No.
No.
はい
No.
No.
VRCHAR列を拡張
No.
はい
No.
はい
はい
列のデフォルトを削除
はい
はい
No.
はい
はい
自動インクリメンタル値を変更
No.
はい
No.
はい
No*
設定はnullです
No.
はい
はい*
はい
No.
列not nullを設定します
No.
はい*
はい*
はい
No.
ENUM/SET列の定義を変更します。
はい
はい
No.
はい
はい
instantアルゴリズムは、最も広い範囲で列を追加するべきであり、このアルゴリズムを使用するか、それともいくつかの制限が見られます。
  • 、add columnおよびその他の動作が含まれている場合、instantアルゴリズムをサポートしていない動作がある場合、alter文はエラーとなり、すべての動作は実行されません。
  • は、既存の列の中間に列を追加することをサポートすることなく、最後に列を追加することができます。
  • は圧縮テーブルをサポートしていません。つまり、この表の行のフォーマットはCOMPRESSEDではありません。
  • は全文索引を含むテーブルをサポートしていません。
  • は一時テーブルをサポートしていません。
  • は、データ辞書空間で作成されたテーブルをサポートしていません。
  • 言ったのがもっと多いというより実際に測ってみます。以下は8.0.19バージョンを例にして、実際に検証してみます。
    
    #   sysbench    1000W   
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.19  |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from sbtest1;
    +----------+
    | count(*) |
    +----------+
    | 10000000 |
    +----------+
    
    #         
    mysql> alter table sbtest1 add column col1 varchar(20), algorithm=instant;
    Query OK, 0 rows affected (0.63 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    
    #         
    mysql> alter table sbtest1 add column create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '    ', algorithm=instant;
    Query OK, 0 rows affected (0.58 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    
    #      instant  
    mysql> alter table sbtest1 add column col2 varchar(20);
    Query OK, 0 rows affected (0.55 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    
    #        
    mysql> alter table sbtest1 alter column col1 set default 'sql',algorithm=instant;
    Query OK, 0 rows affected (0.02 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    
    #   In Place     ,(5.7          )
    mysql> alter table sbtest1 add column col_inplace varchar(20),algorithm=inplace;
    Query OK, 0 rows affected (1 min 23.30 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    以上のテストを通して、instantアルゴリズムを使って列を追加するのは基本的に1 s以内で行われ、この速度は大表にとって非常に速く、業務はほとんど感知されないことが分かりました。5.7バージョンのinplaceアルゴリズムを使用すると、列を追加する時間は数分まで上昇する。比較してみると、8.0バージョンの快速列機能は本当に実用的です。
    まとめ:
    高速列にはいくつかの制限がありますが、instantアルゴリズムも一部のDDL操作にしか適用されませんでした。しかし、8.0のこの新しい機能はすでに興奮に満ちています。この文章を通じて、この新しい機能を知ってほしいです。8.0にアップグレードしたいですか?
    以上がMySQL 8.0どのように快速に列の詳細を追加しますか?MySQL 8.0に関する詳細については、他の関連記事に注目してください。