PolarDB新增支持并行DDL的功能。当数据库硬件资源空闲时,您可以通过并行DDL功能加速DDL执行,避免阻塞后续相关的DML操作,缩短执行DDL操作的窗口期。

前提条件

PolarDB集群版本需满足如下条件之一:
  • PolarDB MySQL8.0且修订版本为8.0.1.1.7或以上。
  • PolarDB MySQL5.7且修订版本为5.7.1.0.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加速比结果如下图所示。A
    • 开启innodb_polar_parallel_ddl_threads参数,同时使用Optimization A优化后,并行DDL加速比结果如下图所示。B

相关视频