Overview
MySQL HeatWave on AWSでは、クライアントからMySQLのテーブルにデータをインポートするためのMySQLネイティブデータインポート機能(LOAD DATA 文)を提供しています。これは、MySQL HeatWave に少量のデータセットのみをインポートしたい場合に便利です。しかし、AWS 上でアプリケーションやワークロードを実行しているお客様の中には、データを Amazon S3 に保存しており、データセットが大規模になることがよくあります。
今回、Amazon S3からMySQL HeatWave on AWSに大規模なデータセットをインポートできるようにするために、MySQLネイティブデータインポート機能を拡張し、データ転送コストをかけずに MySQL に直接インポートできるようにしました。また、新しい一括取り込みアルゴリズムを導入し、メモリ使用量を抑えながらデータインポートのパフォーマンスを向上させました。

MySQLの既存のLOAD DATA文が拡張されました。
- FROM S3 s3-uriにより、MySQLサーバーはS3からデータファイルを直接読み取ることができます。
- ALGROITHM=BULK により、高速データインポートのための新しいバルクインジェストアルゴリズムの使用を示します。

AWS Aurora MySQLと比較すると、AWS S3のデータファイルで既にソート済みの1TBデータをインポートした場合、MySQL HeatWave on AWSは12.4倍高速です。ソートされていないデータの場合、MySQL HeatWave on AWSはAuroraよりも7.5倍高速で、メモリ使用量は5.8分の1です。アーキテクチャ
MySQL HeatWave は次の 2 つの側面で強化されました。
- AWS Identity and Access Management (IAM)との統合により、お客様のAWSアカウント内のデータに安全にアクセスします。

MySQL HeatWave on AWSは、AWS Identity and Access Management (IAM) サービスが提供するクロスアカウントロールメカニズムを活用しています。このメカニズムにより、お客様はMySQL HeatWaveデータベースシステムにS3へのアクセス権限を委任できます。 これを実現するには、まずお客様のAWS アカウントに、信頼ポリシーと権限ポリシーを含むAWS IAM ロールを作成する必要があります。
信頼ポリシーは、このIAMロールを引き受けることができるユーザー(つまり、MySQL HeatWaveサービスのAWS アカウントでホストされているMySQL HeatWaveデータベースシステム)を指定
権限ポリシーは、対応するMySQL HeatWaveデータベースシステムにロールで許可する操作(つまり、S3バケット内のオブジェクトへの読み取り専用アクセス)を指定
顧客がこのロールをMySQL HeatWaveデータベース システムに関連付けると、一括取り込み時にのみこのIAMロールを引き受け、AWS IAMから一時的な認証情報を取得して S3 内の顧客のデータにアクセスします。
- 一括取り込みパフォーマンスの改善:
LOAD DATAコマンドが採用するデフォルトのアルゴリズムは、B+ツリーインデックスへのインプレース挿入を実行します。このため、連続した挿入がインデックスページの局所性を示していない場合、インデックスページの読み書きのためのディスクI/O操作が頻繁に発生します。さらに、複数のファイルを同じテーブルにロードするために複数のLOAD DATAコマンドを発行すると、B+ツリーのトラバーサルにおいてパスが重複する挿入がB+ツリーラッチの競合を引き起こします。 新しいバルク取り込みアルゴリズムは、インデックスB+ツリーへのインプレース挿入を回避することで、これらのパフォーマンスボトルネックを解消します。代わりに、新しいバルク取り込みアルゴリズムは、複数のスレッドを使用して入力データの小さな部分をメモリ内でソートおよびマージすることに大きく依存し、最終的なB+ツリーを最終段階で構築します。

上の図に示すように、バルクインジェストは3つのフェーズでデータを読み込みます。
- 入力データがまだソートされていない場合、複数のスレッドが並列にメモリ内の入力データの一部をソートし、各スレッドが専用のデータパーティションを並列にマージしてソート済みのチャンクを形成します。
- 複数のスレッドがこれらのソート済みチャンクから複数の非結合サブツリーを並列に構築し、ディスクに書き込みます。
- 非結合サブツリーは、最終的なクラスター化インデックスを表す単一のB+ツリーにマージされます。
バルクインジェストアルゴリズムの最も重要な利点は次のとおりです。
- デフォルトのLOAD DATAアルゴリズムと比較して、バルクインジェストでは、最終的なB+が形成される前に複数のスレッドによってメモリ内ソートとマージが並列に実行されるため、B+ツリーラッチの競合が排除されます。
- バルクインジェストでは、メモリ内ソートとマージによりソート済みデータがディスクに順次書き込まれるため、頻繁なランダムディスクIOが排除されます。
- バルクインジェストアルゴリズムは高度にパイプライン化されているため、コンピューティングとディスクIOの重複が大きくなります。
バルクインジェストを使用してAWS S3上のデータをMySQL HeatWaveにインポートする例
この例では、AirportDB の予約テーブルに対応するサンプルデータファイルはすでに AWS S3 にアップロードされており、MySQL HeatWave DB システムに関連付けて S3 バケットへのアクセスを許可できる AWS IAM ロールもすでに作成されています。
AWS IAM Role:
arn:aws:iam::612981981079:role/oracle-mysql-heatwave-sample-data-role
S3 URI of the booking table files (assuming will be imported by a DB System in us-east-1 region):
s3-us-east-1://oracle-mysql-heatwave-sample-data-us-east-1/published/airportdb/v1/tsv/booking.tsv
1.MySQL HeatWaveインスタンスへのアクセス権付与
既存のMySQL HeatWaveデータベースシステムにS3上のサンプルデータへのアクセスを許可するには、MySQL HeatWaveサービスコンソールに移動し、DBシステムを編集してAWS IAMロールをDBシステムに関連付けてください。

2.バルクインジェストを使用したデータのインポート
IAMロールがDBシステムに関連付けられたら、バルクインジェストを使用してデータをインポートできます。
- airportdbデータベースとbookingテーブルを作成します
- コンソールのQuery Editorを使用して、MySQL HeatWave DBシステムに接続します

- CREATE DATABASE airportdb;
- USE airportdb;
- CREATE TABLE IF NOT EXISTS `booking` (`booking_id` int NOT NULL AUTO_INCREMENT,`flight_id` int NOT NULL,`seat` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`passenger_id` int NOT NULL,`price` decimal(10,2) NOT NULL,PRIMARY KEY (`booking_id`)) ENGINE=InnoDB AUTO_INCREMENT=55099799 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT=’Flughafen DB by Stefan Pröll, Eva Zangerle, Wolfgang Gassler is licensed under CC B Y 4.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/4.0′;
3.テーブルが作成されたら、バルクインジェストを使用してS3からテーブルへデータをインポートできます。

この例では、サンプルデータは25個のファイルに分割されており、booking.tsv.1、booking.tsv.2 といった命名形式になっています。入力データを複数のファイルに分割することで、データ取り込みのパフォーマンスを向上させることができます。
- LOAD DATA FROM S3 ‘s3-us-east-1://oracle-mysql-heatwave-sample-data-us-east-1/published/airportdb/v1/tsv/booking.tsv.’ COUNT 25 IN PRIMARY KEY ORDER INTO TABLE booking COLUMNS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’ ALGORITHM=BULK;
サマリー:
強化されたバルクインジェストは、Amazon S3上のデータを直接インポートするための、安全かつ高速なMySQLネイティブのインポート機能を提供します。AWS Auroraと比較して10倍高速であり、既存のワークロードの移行や、顧客データやアプリケーションデータの取り込みをより容易にし、その後の処理を効率化します。
