PolarDB には、DDL 非同期 I/O 機能が追加されました。大規模テーブルに対して DDL 文を実行してインデックスを作成する操作は時間がかかります。DDL 非同期 I/O 機能を使用することで、インデックス作成時間を短縮できます。
前提条件
作業を開始する前に、ご利用の PolarDB クラスターが以下のいずれかのバージョン要件を満たしていることを確認してください。
PolarDB for MySQL 8.0.2、リビジョンバージョン 8.0.2.2.6 以降
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.29 以降
現在のバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。
制限事項
DDL 非同期 I/O は、以下には適用されません。
全文検索インデックス
空間インデックス
DDL 非同期 I/O の有効化
クラスターパラメータ設定で、innodb_polar_ddl_async_io パラメーターを ON に設定します。手順については、「クラスターおよびノードパラメーターの設定」をご参照ください。
| パラメーター | レベル | デフォルト | 有効値 | 説明 |
|---|---|---|---|---|
innodb_polar_ddl_async_io | グローバル | OFF | ON、OFF | DDL 非同期 I/O を有効または無効にします |
パフォーマンステスト
以下のテストでは、大規模テーブルでのインデックス作成に対する DDL 非同期 I/O の影響を測定します。
テスト環境
PolarDB for MySQL 8.0、CPU コア数 8、メモリ 32 GB、ストレージ容量 50 TB
スキーマ
CREATE TABLE `table_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`seller_id` bigint(20) DEFAULT NULL,
`seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`gmt_create` varchar(30) DEFAULT NULL,
`update_time` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;テストデータ
以下のストアドプロシージャは、table_1 に 100,000,000 行を挿入します。
delimiter ||
CREATE PROCEDURE populate_0(IN NUM INT)
BEGIN
DECLARE sid INT;
DECLARE suffix_name INT;
DECLARE i INT;
SET sid=1000;
SET suffix_name=10;
SET i=1;
START TRANSACTION;
WHILE i <= NUM
DO
INSERT INTO table_1(seller_id,seller_name,gmt_create,update_time)
VALUES(sid,CONCAT('sellername',suffix_name),NOW(),NOW());
SET suffix_name=suffix_name+1;
SET sid=sid+1;
SET i=i+1;
END WHILE;
COMMIT;
END ||
delimiter ;
CALL populate_0(100000000);テスト方法と結果
以下の文を、DDL 非同期 I/O を有効にした状態と無効にした状態でそれぞれ実行し、実行時間を比較します。
ALTER TABLE table_1 ADD INDEX name_index (seller_name);| DDL 非同期 I/O | 時間 (秒) |
|---|---|
| 有効 | 368 |
| 無効 | 485 |
このテストでは、DDL 非同期 I/O を有効にすることで、インデックス作成時間が約 24 % 短縮されました。
お問い合わせ
DDL 操作についてご質問がある場合は、「テクニカルサポートへのお問い合わせ」をご利用ください。