高速 DDL を使用して Amazon Aurora でテーブルを変更する - Amazon Aurora

高速 DDL を使用して Amazon Aurora でテーブルを変更する

MySQL において、何度もデータ操作言語 (DDL) オペレーションを行うと、パフォーマンスに大きな影響が出ることがあります。最新バージョンのオンライン DDL を使用しても、パフォーマンスへの影響は発生します。

例えば、ALTER TABLE オペレーションを使用して列をテーブルに追加するとします。オペレーションに指定するアルゴリズムによっては、このオペレーションに以下の操作が伴う場合があります。

  • テーブル全体のコピーの作成

  • 同時データ操作言語 (DML) オペレーションを処理するための一時テーブルの作成

  • テーブルのすべてのインデックスの再構築

  • 同時 DML 変更の適用時におけるテーブルロックの適用

  • 同時 DML スループットの低下

Amazon Aurora では、高速 DDL を使用して、適切な ALTER TABLE オペレーションをほぼ瞬時に実行できます。このオペレーションを実行するために、テーブルをコピーする必要はありません。また、他の DML ステートメントに実質的な影響を及ぼすことなく実行できます。このオペレーションは、テーブルのコピーに一時ストレージを使用しないため、スモールインスタンスクラスの大きなテーブルに対しても、DDL ステートメントを使用できます。

重要

現在、Aurora MySQL で高速 DDL を使用するには Aurora ラボモードを有効にする必要があります。本番稼動用 DB クラスターに高速 DDL を使用することはお勧めしません。Aurora ラボモードを有効にする方法については、「Amazon Aurora MySQL ラボモード」を参照してください。

高速 DDL の制限事項

現在、高速 DDL には以下の制限があります。

  • 高速 DDL は、NULL を許容する列 (デフォルト値を持たない) を、既存テーブルの末尾に追加する場合にのみ使用できます。

  • 高速DDLは、パーティション化されたテーブルでは機能しません。

  • 高速 DDL は、REDUNDANT 行形式を使用する InnoDB テーブルをサポートしていません。

  • Fast DDL は、フルテキスト検索インデックスを持つテーブルでは機能しません。

  • DDL オペレーションの最大有効レコードサイズが大きすぎる場合、高速 DDL は使用されません。ページサイズの半分を超えるレコードサイズは大きすぎます。レコードの最大サイズは、すべての列の最大サイズを追加して計算されます。サイズを変更可能な列の場合は、InnoDB 標準に基づき、extern byte は計算に含まれません。

    注記

    最大レコードサイズチェックが Aurora 1.15 に追加されました。

高速 DDL の構文

ALTER TABLE tbl_name ADD COLUMN col_name column_definition

このステートメントには、以下のオプションがあります。

  • tbl_name変更するテーブルの名前。

  • col_name追加する列の名前。

  • col_definition追加する列の定義。

    注記

    NULL を許容する列の定義は、デフォルト値を使用せずに指定する必要があります。そうでないと、高速 DDL は使用されません。

高速 DDL の例

次の例では、高速 DDL オペレーションによる高速化を示します。最初の SQL の例では、高速 DDL を使用せずに大きなテーブルで ALTER TABLE ステートメントを実行します。この操作にはかなりの時間がかかります。CLI の例では、クラスターで高速 DDL を有効化する方法を示します。次に、別の SQL の例では、同じテーブルで同じ ALTER TABLE ステートメントを実行します。高速 DDL を有効化すると、オペレーションが非常に高速になります。

この例では、1 億 5000 万行を含む、TPC-H ベンチマークの ORDERS テーブルを使用しています。このクラスターでは、比較的小さなインスタンスクラスを意図的に使用し、高速 DDL を使用できない場合に ALTER TABLE ステートメントにかかる時間を示しています。この例では、同じデータを含む元のテーブルのクローンを作成します。aurora_lab_mode 設定を確認すると、ラボモードが有効になっていないため、クラスターで高速 DDL を使用できないことが分かります。その場合、ALTER TABLE ADD COLUMN ステートメントでテーブルの最後に新しい列を追加するには、かなりの時間がかかります。

mysql> create table orders_regular_ddl like orders; Query OK, 0 rows affected (0.06 sec) mysql> insert into orders_regular_ddl select * from orders; Query OK, 150000000 rows affected (1 hour 1 min 25.46 sec) mysql> select @@aurora_lab_mode; +-------------------+ | @@aurora_lab_mode | +-------------------+ | 0 | +-------------------+ mysql> ALTER TABLE orders_regular_ddl ADD COLUMN o_refunded boolean; Query OK, 0 rows affected (40 min 31.41 sec) mysql> ALTER TABLE orders_regular_ddl ADD COLUMN o_coverletter varchar(512); Query OK, 0 rows affected (40 min 44.45 sec)

この例では、前の例と同様に大きなテーブルを準備します。ただし、Interactive SQL セッション内で単にラボモードを有効にすることはできません。この設定は、カスタムパラメータグループで有効にする必要があります。そのためには、mysql セッションを終了して AWS CLI コマンドをいくつか実行するか、AWS Management Console を使用する必要があります。

mysql> create table orders_fast_ddl like orders; Query OK, 0 rows affected (0.02 sec) mysql> insert into orders_fast_ddl select * from orders; Query OK, 150000000 rows affected (58 min 3.25 sec) mysql> set aurora_lab_mode=1; ERROR 1238 (HY000): Variable 'aurora_lab_mode' is a read only variable

クラスターのラボモードを有効にするには、パラメータグループをいくつか使用する必要があります。この AWS CLI の例では、クラスターのパラメータグループを使用して、クラスター内のすべての DB インスタンスのラボモード設定で同じ値を使用するようにします。

$ aws rds create-db-cluster-parameter-group \ --db-parameter-group-family aurora5.6 \ --db-cluster-parameter-group-name lab-mode-enabled-56 --description 'TBD' $ aws rds describe-db-cluster-parameters \ --db-cluster-parameter-group-name lab-mode-enabled-56 \ --query '*[*].[ParameterName,ParameterValue]' \ --output text | grep aurora_lab_mode aurora_lab_mode 0 $ aws rds modify-db-cluster-parameter-group \ --db-cluster-parameter-group-name lab-mode-enabled-56 \ --parameters ParameterName=aurora_lab_mode,ParameterValue=1,ApplyMethod=pending-reboot { "DBClusterParameterGroupName": "lab-mode-enabled-56" } # Assign the custom parameter group to the cluster that's going to use fast DDL. $ aws rds modify-db-cluster --db-cluster-identifier tpch100g \ --db-cluster-parameter-group-name lab-mode-enabled-56 { "DBClusterIdentifier": "tpch100g", "DBClusterParameterGroup": "lab-mode-enabled-56", "Engine": "aurora", "EngineVersion": "5.6.mysql_aurora.1.22.2", "Status": "available" } # Reboot the primary instance for the cluster tpch100g: $ aws rds reboot-db-instance --db-instance-identifier instance-2020-12-22-5208 { "DBInstanceIdentifier": "instance-2020-12-22-5208", "DBInstanceStatus": "rebooting" } $ aws rds describe-db-clusters --db-cluster-identifier tpch100g \ --query '*[].[DBClusterParameterGroup]' --output text lab-mode-enabled-56 $ aws rds describe-db-cluster-parameters \ --db-cluster-parameter-group-name lab-mode-enabled-56 \ --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \ --output text | grep aurora_lab_mode aurora_lab_mode 1

次の例では、パラメータグループの変更が有効になった後の手順を示します。クラスターで高速 DDL を使用できることを確認するため、aurora_lab_mode 設定をテストします。次に、ALTER TABLE ステートメントを実行して、別の大きなテーブルの末尾に列を追加します。ここでは、ステートメントは非常に高速で終了します。

mysql> select @@aurora_lab_mode; +-------------------+ | @@aurora_lab_mode | +-------------------+ | 1 | +-------------------+ mysql> ALTER TABLE orders_fast_ddl ADD COLUMN o_refunded boolean; Query OK, 0 rows affected (1.51 sec) mysql> ALTER TABLE orders_fast_ddl ADD COLUMN o_coverletter varchar(512); Query OK, 0 rows affected (0.40 sec)