本文对DDL IO性能优化进行了整体介绍。
PolarDB是计算与存储分离的技术架构,计算节点通过高性能RDMA访问分布式存储,但分布式存储的访问延迟依然明显高于本地盘的访问延迟。在大表DDL场景中,DDL操作会触发大量的IO操作,因此分布式存储的额外延迟对DDL会有一定的性能影响。针对这类问题,PolarDB在DDL IO路径上主要实现了以下功能:
性能测试
测试环境
一个规格为8核32 GB的PolarDB MySQL版8.0版本的集群。
集群存储空间为50 TB。
测试表结构
通过如下语句创建一张名为
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;
测试表数据
通过如下语句生成测试数据:
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预读、异步IO、多路归并排序功能开启情况
耗时(秒)
开启DDL预读、异步IO、多路归并排序功能:
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预读、异步IO、多路归并排序功能:
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