このトピックでは、DDLステートメントのI/Oパフォーマンスの最適化について説明します。
PolarDBは、コンピューティングとストレージの分離アーキテクチャを使用します。 計算ノードは、高性能RDMAを使用して分散ストレージにアクセスします。 ただし、分散ストレージアクセスのレイテンシは、依然としてローカルディスクアクセスのレイテンシよりも大幅に高くなります。 大きなテーブルに対するDDL操作は、多数のI/O操作をトリガーします。 したがって、分散ストレージアクセスのレイテンシは、DDLステートメントのパフォーマンスに影響します。 I/Oレイテンシを削減するために、PolarDBには次の機能があります。
DDL先読み: DDLステートメントの先読みスレッドがインデックスを作成して、I/O読み取り待ち時間を短縮できるようにします。
DDL非同期I/O: DDL書き込み中にバックグラウンド書き込みスレッドを有効にして、I/O書き込みレイテンシを削減します。
DDLマルチウェイマージおよびソート: DDLステートメントのI/O操作とI/Oレイテンシを削減します。
パフォーマンステスト
テスト環境
8 CPUコアと32 GBメモリを持つPolarDB for MySQL 8.0のクラスター。
クラスターのストレージ容量は50テラバイトです。
Schema
次のステートメントを実行して、
table_1という名前のテーブルを作成します。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;Data
次の文を実行してテストデータを生成します。
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) ;テスト方法とテスト結果
テーブルにデータを入力した後、
ALTER TABLE table_1 ADD INDEX name_index (seller_name);ステートメントを実行して、DDLの実行効率を比較します。DDL先読み、DDL非同期I/O、およびDDLマルチウェイマージとソート
消費時間 (秒)
DDL先読み、DDL非同期I/O、およびDDLマルチウェイマージとソートが有効になっています。
loose_innodb_polar_ddl_build_index_readahead=ON
loose_innodb_polar_ddl_build_index_readahead_page_num=256
innodb_polar_ddl_async_io=ON
innodb_polar_parallel_merge_ways=8
252
DDL先読み、DDL非同期I/O、およびDDLマルチウェイのマージとソートが無効になっています。
loose_innodb_polar_ddl_build_index_readahead=OFF
loose_innodb_polar_ddl_build_index_readahead_page_num=64
innodb_polar_ddl_async_io=OFF
innodb_polar_parallel_merge_ways=2
485