PolarDB新增DDL多路归并排序功能。数据库大表中建立索引的DDL操作通常非常耗时,您可以通过DDL多路归并排序功能, 缩短建立索引的DDL操作中索引排序的时间。
前提条件
PolarDB集群版本需满足如下条件之一:
PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.5及以上。
PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.28及以上。
PolarDB MySQL版5.7版本且修订版本为5.7.1.0.23及以上
如何确认集群版本,详情请参见查询版本号。
注意事项
当前不支持对全文索引和空间索引进行DDL多路归并排序。
使用DDL多路归并排序时,集群内存使用率会略微上升。假设开启了N路归并排序,排序过程中占用的集群内存大小为
(N+1)*innodb_sort_buffer_size
Byte。
使用方法
您可以通过如下innodb_polar_parallel_merge_ways参数设置归并排序的路数:
参数 | 级别 | 说明 |
innodb_polar_parallel_merge_ways | Session | 设置建立索引过程中归并排序的路数。取值范围:2~16。默认值为2,表示数据库默认为二路归并排序。当该参数值大于2时,表示开启多路归并排序。 |
性能测试
测试环境
一个规格为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) ;
测试方法及结果
数据插入完成以后,分别设置8路归并排序和2路归并排序,通过执行SQL
alter table table_1 add index name_index (seller_name);
来测试DDL执行效率的提升比例:归并排序路数
耗时(秒)
8路归并排序
353
2路归并排序
485
联系我们
若您对DDL操作有任何疑问,请联系我们。