PolarDB新增支持并行DDL的功能。当数据库硬件资源空闲时,您可以通过并行DDL功能加速DDL执行,避免阻塞后续相关的DML操作,缩短执行DDL操作的窗口期。
前提条件
PolarDB集群版本需为PolarDB MySQL 8.0且Revision version为8.0.1.1.7或以上,您可以通过查询版本号确认集群版本。
注意事项
开启并行DDL功能后,由于并行线程数的增加,硬件资源(如CPU、内存、IO等)的占用也会随之增加,可能会影响同一时间内执行的其他SQL操作,因此建议在业务低峰或硬件资源充足时使用并行DDL。
使用限制
目前并行DDL加速仅支持创建二级索引(不包括聚簇索引、全文索引、空间索引和虚拟列上的二级索引)的DDL操作。
背景信息
传统的DDL操作基于单核和传统硬盘设计,导致针对大表的DDL操作耗时较久,延迟过高。以创建二级索引为例,过高延迟的DDL操作会阻塞后续依赖新索引的DML查询操作。多核处理器的发展为并行DDL使用更多线程数提供了硬件支持,而固态硬盘(Solid State Disk,简称SSD)的普及使得随机访问延迟与顺序访问延迟相近,使用并行DDL加速大表的索引创建显得尤为重要。
使用方法
- innodb_polar_parallel_ddl_threads
您可以通过如下innodb_polar_parallel_ddl_threads参数开启并行DDL功能:
参数 级别 取值范围 说明 innodb_polar_parallel_ddl_threads Session [1~8] 默认值为1。
控制每一个DDL操作的并行线程数。默认值为1,即执行单线程DDL。 若该参数值不为1,当执行创建二级索引操作时将自动开启并行DDL。
Optimization A
若仅开启并行DDL功能仍不能满足您的需求,您还可以通过
Optimization A
对创建索引过程中的排序或建索引树过程进行进一步优化。说明Optimization A
功能尚在内测中,暂不支持自定义开启该功能,如需使用,请提交工单联系技术支持。
性能测试
- 测试环境
- 一个规格为16核128 GB的标准版PolarDB MySQL 8.0集群。
- 集群存储空间为50 TB。
- 测试表结构
通过如下语句创建一张名为
t0
的表:CREATE TABLE t0( a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
- 测试表数据
通过如下语句生成测试数据:
DELIMITER // CREATE PROCEDURE populate_t0() BEGIN DECLARE i int DEFAULT 1; WHILE (i <= $table_size) DO INSERT INTO t0 VALUES (i, 1000000 * RAND()); SET i = i + 1; END WHILE; END // DELIMITER ; CALL populate_t0() ;
说明- 实际测试时请将
$table_size
替换成具体的表内记录数,如1000000
。 - 本测试分别使用了包含1000000行、10000000行、100000000行、1000000000行记录数的表,以及一张包含1 TB数据量的表。
- 1 TB数据量的测试用表通过SysBench工具生成。如何使用SysBench工具,请参见测试工具。
- 实际测试时请将
- 测试方法
当使用不同的并行线程数(即设置innodb_polar_parallel_ddl_threads参数为1、2、4、8、16和32)时,测试在不同数据量的表中开启并行DDL后,在数据类型为
INT
的字段b
上创建二级索引带来的DDL执行效率的提升比例。 - 测试结果
- 仅开启innodb_polar_parallel_ddl_threads参数后,并行DDL加速比结果如下图所示。
- 开启innodb_polar_parallel_ddl_threads参数,同时使用
Optimization A
优化后,并行DDL加速比结果如下图所示。
- 仅开启innodb_polar_parallel_ddl_threads参数后,并行DDL加速比结果如下图所示。