PolarDB新增DDL预读功能。数据库中大表的DDL操作通常非常耗时,您可以通过DDL预读功能缩短执行DDL操作的时间。
前提条件
PolarDB集群版本需满足如下条件之一:
- PolarDB MySQL版8.0版本且修订版本为8.0.1.1.28及以上。 
- PolarDB MySQL版5.7版本且修订版本为5.7.1.0.22及以上。 
- PolarDB MySQL版5.6版本且修订版本为5.6.1.0.34及以上。 
如何确认集群版本,详情请参见查询版本号。
注意事项
开启DDL预读功能后,由于预读线程的存在,IO资源的占用也会随之增加,可能会影响同一时间内正在执行的其他SQL操作,因此建议在业务低峰期使用DDL预读功能。
使用方法
- loose_innodb_polar_ddl_build_index_readahead - 您可以通过如下loose_innodb_polar_ddl_build_index_readahead参数开启DDL预读功能: - 参数 - 级别 - 说明 - loose_innodb_polar_ddl_build_index_readahead - Global - DDL预读功能的开关,取值范围如下: - ON:开启DDL预读功能。 
- OFF:关闭DDL预读功能(默认值)。 
 
- loose_innodb_polar_ddl_build_index_readahead_page_num - 您还可以通过如下loose_innodb_polar_ddl_build_index_readahead_page_num参数设置DDL预读的数据量: - 参数 - 级别 - 说明 - loose_innodb_polar_ddl_build_index_readahead_page_num - Global - DDL预读的page数量,一个page大小是16k。取值范围:32~256。默认值为64。 
性能测试
- 测试环境 - 一个规格为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) ;
- 测试方法及结果 - 数据插入完成以后,需要重启PolarDB进程,保证内存buffer_pool中没有缓存数据。通过对比是否开启DDL预读功能,来测试DDL执行效率的提升比例。 - 通过执行SQL - alter table table_1 add index name_index (seller_name);来进行DDL执行效率的对比:- DDL预读功能开启情况 - 耗时(秒) - 关闭DDL预读功能 - 485 - 开启DDL预读功能 - (loose_innodb_polar_ddl_build_index_readahead_page_num为256) - 412 
- 通过执行SQL - alter table table_1 add column c1 varchar(100) after id;来进行DDL执行效率的对比:- DDL预读功能开启情况 - 耗时(秒) - 关闭DDL预读功能 - 264 - 开启DDL预读功能 - (loose_innodb_polar_ddl_build_index_readahead_page_num为256) - 159 
 
联系我们
若您对DDL操作有任何疑问,可通过钉钉搜索群号入群咨询。您可以直接@群内专家,并附上您要咨询的问题;同时群内也有PolarDB MySQL版小助手24*7小时在线回答您的问题。钉钉群号:15375044501。