mysql alter table add columnのいくつかの性能知識点

2853 ワード

今日はawsのAurora MySQLで、300万データの表に列を追加し、中間指定位置の追加をテストし、デフォルトの末尾の追加を行い、発見速度が速いことを調査しました.
一般的なイメージでは、デフォルトよりも中間追加が遅いはずですが、結果的には少し早いです.もっと深く知りたいです.以下は内容です.
質問:列を追加する場合、①defaultを末尾に追加することと②指定位置に追加することの2つの性能にどのような違いがありますか.構文:①defaultデフォルトでは位置を指定する必要はなく、末尾に追加されます
alter table table_name add column_name CHAR(10) ;

②指定位置、first指定カラムヘッダ、after指定カラムの後、beforeキーワードなし
alter table table_name ADD column_name CHAR(11) FIRST;
alter table table_name ADD column_name CHAR(11) AFTER column1;

MySQL、テーブルに列を追加したときに何があったか(同じ処理速度の差は多くない)
指定されたアルゴリズムに従って、このアクションは次のステップに関連します.
  • テーブルの完全なコピーを作成する
  • 一時テーブルを作成し、同時データ操作言語(DML)操作
  • を処理する.
  • このテーブルのすべてのインデックスを再構築する
  • 同時DML変更を適用する場合、適用テーブルロック
  • 同時DMLスループット
  • を減速する.
    MySQLの両方の操作は同じはずです.消費が大きいことがわかります.
    AWS Aurora MySQLでfast DDLを有効にする(異なる処理)
    fast DDLがオンになっているかどうかを確認し、aurora_を通じてlab_modeのon offはfast DDLが有効かどうかを確認します.
    mysql> show variables like 'aurora_lab_mode';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | aurora_lab_mode | OFF   |
    +-----------------+-------+
    1 row in set (0.01 sec)

    FastDDLを有効にするとMySQLの痛みをかなり和らげることができます.「高速DDLは、ALTER TABLE操作を即座に実行します.この操作を完了するには、テーブルをコピーする必要はなく、他のDML文にも大きな影響はありません.この操作は、テーブルコピーに一時記憶を使用しないため、スモールインスタンスクラスの大規模なテーブルに対してもDDL文を使用できます.」(ソースawsドキュメントhttps://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.FastDDL.html)
    なお、上記のSQLの例では、FastDDLは①defaultのデフォルトに対応しているだけで位置を指定する必要はありません.したがってFastDDLをオンにすると、比較的大きなデータテーブルに1列追加され、①デフォルトで指定されていない位置の性能は②指定された位置の性能よりはるかに優れています.
    上のリンクにはFastDDLの制限が具体的に書かれています(制限されています②):
  • Express DDLでは、デフォルト値がなく、空のカラムになり、既存のテーブルの最後に追加できることのみがサポートされています.
  • 快速DDLはパーティション表をサポートしていません.
  • クイックDDLでは、REDUNDANT行形式のInnoDBテーブルはサポートされていません.
  • DDLオペレーションの最大可能なレコードサイズが大きすぎる場合、高速DDLは使用されません.ページサイズの半分より大きい場合は、レコードサイズが大きすぎることを示します.レコードの最大サイズは、すべてのカラムの最大サイズを加算します.可変サイズのカラムの場合、InnoDB規格では計算に外部バイトは含まれません.

  • SQLserverに列を追加して何が起こるか(異なる処理)
    まずSQLseverに任意の場所を指定して列を追加する構文はありません.この機能を実現するには、次の操作が必要です.1.データ一時保存表2.新規列を有する表3にする.テンポラリ・テーブルからデータを取り戻す
    表:testTable
    column0    column2new    column1 user1    men    tokyo user2    women    saitama
    //      #test
    SELECT * INTO #test
     //    
    DROP TABLE testTable
     //     
    CREATE TABLE testTable
    (
     column0 int NOT NULL,
     column2new nvarchar2(5),
     column1 nvarchar2(20)
    )
     //              
    INSERT INTO testTable
    SELECT
     t.column0,
     0,
     t.column1
    FROM #test t
     //      
    DROP TABLE #test

    SQLseverの構文(通常のデフォルトモード):
    ALTER TABLE testTable ADD column2new;

    上記の複雑な操作には関係なく、デフォルトは末尾に加算されます.
    Alter table,Aurora MySQLとmysqlのパフォーマンス比較
    いい文章ですね.http://blog.symedia.pl/2017/06/ddl-performance-on-mysql-aurora.html
     
    以上です.