Faster DDL

更新时间:
复制 MD 格式

优化DDL操作过程中的Buffer Pool管理机制,降低DDL操作带来的性能影响,提升在线DDL操作的并发数。

前提条件

实例版本如下:

背景信息

数据库经常会执行DDL操作,也经常会遇到DDL相关的问题,例如:

  • 为什么加索引会造成实例的抖动,影响正常的业务读写?

  • 为什么不到1 GB的表执行DDL有时需要十几分钟?

  • 为什么使用了临时表的连接退出时会造成实例抖动?

针对这些常见问题,RDS内核团队进行分析后发现MySQLDDL操作期间的缓存维护逻辑存在性能缺陷,通过深入分析及多次测试,开发Faster DDL功能,优化了Buffer Pool页面管理策略,大幅减少DDL操作导致的锁争用,有效解决或缓解上述问题,让您的实例在正常业务压力下可以安心执行DDL操作。

开启Faster DDL

您可以在控制台修改参数loose_innodb_rds_faster_ddlON,开启Faster DDL。详情请参见设置实例参数

DDL场景测试

  • 测试场景

    选取RDS MySQL 8.0支持的两种In Place Online DDL操作进行验证, 其中CREATE INDEX操作不需要重建表,OPTIMIZE TABLE操作需要重建表。

    操作

    Instant

    In Place

    重建表

    允许并发DML

    只修改元数据

    CREATE INDEX

    OPTIMIZE TABLE

  • 测试实例

    MySQL 8.0实例(8核、64 GB),执行DDL操作的表大小为600 MB。

  • 测试过程

    使用Sysbench模拟线上业务进行压力测试,在压测期间执行DDL操作,进行反复对比测试。

  • 测试结果

    操作

    平均执行时间(关闭优化)

    平均执行时间(开启优化)

    性能提升倍数

    Create Index

    56

    4.9

    11.4

    Optimize Table

    220

    17

    12.9

  • 测试小结

    DDL场景下,优化后的AliSQL内核MySQL相比社区版本MySQL,DDL操作执行时间缩短了90%以上。

临时表场景测试

MySQL在很多情况下会使用临时表,例如查询information_schema库里的表、 加速复杂SQL执行时自动创建临时表。在线程退出时系统会集中清理用过的临时表,这也属于一种特殊类型的DDL操作,同样会导致实例的性能抖动。 详情请参见Temp ibt tablespace truncation at disconnection stuck InnoDB under large BP

  • 测试实例

    MySQL 8.0实例(8核、64 GB)。

  • 测试过程

    使用tpcc-mysql进行压力测试,将Buff Pool基本用满,然后发起单线程短连接的临时表请求。

  • 测试结果

    对比项

    正常情况(无DDL操作)

    开启优化

    关闭优化

    每秒事务数(TPS)

    42,000

    40,000

    <10,000

    压测过程中的秒级性能数据如下所示(红线处为关闭DDL加速功能):

    其中 IUD(Insert/Update/Delete)列和 Cmit(Commit)列的数值变化最为显著,反映了关闭 DDL 加速功能前后的 TPS 差异。

    
    05/28 17:49:53  0.01  1/6 0/0 1/6  8.36 70GB 7094   219  260   87  107    2 40.7%     0  5.6MB  2MB 4.6MB  0B
    05/28 17:49:54  0.01  2/6 0/0 2/2  8.43 70GB 6828   219  259   86  130    4 40.4%     0  5.6MB  2MB 4.6MB  0B
    05/28 17:49:55  0.04  1/7 0/0 1/6  8.36 70GB 7629   219  259   91  117    2 42.3%     0  6.2MB 2.1MB 4.8MB  0B
    05/28 17:49:56  0.04  2/4 0/0 2/4  8.12 70GB 6616   219  259   95  119    2 38.4%     0  5.2MB 1.9MB 3.8MB  0B
    05/28 17:49:57  0.04  1/5 0/0 1/5  8.43 70GB 7094   219  259  119    0 41K      0  5.1MB 1.8MB 3.6MB  0B
    05/28 17:49:58  0.04  1/6 0/0 1/6  8.43 70GB 7155   219  259   95  124    0 41K      0  5.1MB 1.8MB 3.5MB  0B
    05/28 17:49:59  0.04  1/7 0/0 1/5  8.43 70GB 7011   219  259   84  115    2 40.5%     0  5.1MB 1.8MB 3.5MB  0B
    05/28 17:50:00  0.17  1/6 0/0 1/4  8.4  70GB 7051   219  259   84  120    2 40.8%     0  5.6MB  2MB 4.5MB  0B
    05/28 17:50:01  ---OS--- -----------Process-----------                       ---MySQL---
                  Load SY/US/WI/IR SY/US CpuR  Mem  IOPS  THD  Conn  Cre  Run  Sel   IUD  Cmit LongQ ByteI ByteO Blog Dump Aply
    05/28 17:50:01  0.17  1/6 0/0 1/5  6.46 70GB 6874   219  259   81  125    0 39.8k    0  4.4MB 1.9MB 4.5MB  0B
    05/28 17:50:02  0.17  2/6 0/0 2/6  8.26 70GB 7205   261   91  259  125    0 40.0k    0  5.6MB  2MB 4.5MB  0B
    05/28 17:50:03  0.17  1/5 0/0 1/5  6.46 70GB 7117   219  259   87  125    0 41.3%     0  5.6MB  2MB 4.5MB  0B
    05/28 17:50:04  0.17  1/6 0/0 1/6  6.46 70GB 7088   219  259   99  120    0 41.6%     0  5.7MB  2MB 4.6MB  0B
    05/28 17:50:05  0.17  1/6 0/0 1/6  8.43 70GB 7088   219  259   98  118    0 39.9%     0  5.5MB  2MB 4.5MB  0B
    05/28 17:50:06  0.17  1/7 0/0 1/7  8.31 70GB 3638   225  289   35  129    2 21.4k     0  3.5MB 1.1MB 2.4MB  0B
    05/28 17:50:07  0.14  1/4 0/0 1/4  8.43 70GB 1388   249  302   13  132    0  8325      0  1.1MB 425KB 950KB  0B
    05/28 17:50:08  0.14  1/8 0/0 1/8  8.24 70GB 1202   296  399    3  130    0  7232      0  1.5MB 385KB 817KB  0B
    05/28 17:50:09  0.14  3/4 0/0 3/4  8.46 70GB  785   287  314    7  151    2  4524      0  636KB 276KB 536KB  0B
    05/28 17:50:10  0.14  1/4 0/0 1/4  8.43 70GB 1087   294    9  122    3  6809      0  959KB 348KB 416KB  0B
    05/28 17:50:11  0.14  2/4 0/0 2/4  8.43 70GB  305   229    3  147    0  3456      0  416KB 256KB 416KB  0B
    05/28 17:50:12  0.14  1/4 0/0 1/4  8.24 70GB  305   287    7  139    3  3259      0  461KB 256KB 416KB  0B
    05/28 17:50:13  0.14  0/4 0/0 0/4  8.26 70GB  361   302    3   76    0  1512      0  197KB  81KB 166KB  0B
    05/28 17:50:14  0.14  0/7 0/0 0/6  8.26 70GB 1815   305    3   86    0 15.7%     0 2.1MB 796KB 1.7MB  0B
    05/28 17:50:15  0.14  0/6 0/0 0/5  8.26 70GB 2009   305    9   86    2 16.2%     0 2.2MB 891KB 1.3MB  0B
    05/28 17:50:16  0.14  1/4 0/0 1/4  8.26 70GB  351   354    4  194    0  2925     78 352KB 127KB 306KB  0B
    05/28 17:50:17  0.14  0/3 0/0 0/3  8.43 70GB  657   354    4  232    2  2506      0 352KB 127KB 306KB  0B
    05/28 17:50:18  0.14  1/4 0/0 1/4  8.24 70GB  345   358    4  232    1   192      0  25KB 132KB  2KB  15KB  0B
    05/28 17:50:19  0.14  1/3 0/0 1/3  8.4  70GB  346   354    4  119    0   -        0  25KB 132KB  2KB  15KB  0B
    05/28 17:50:20  0.14  0/7 0/0 0/7  8.4  70GB  346   354    4  176    0  7897    239  1MB 807KB  15KB   0B
  • 测试小结

    原生MySQL在每次临时表线程退出时出现剧烈的性能抖动,TPS下降超过70%,开启优化之后性能影响降低至5%。

优化效果

Faster DDL加速功能支持RDS MySQL 5.6、5.7、8.0三个版本,但是不同版本支持加速的DDL类型不同,详情请参见下表。

分类

DDL操作

MySQL 5.6

MySQL 5.7

MySQL 8.0

In Place DDL

详情请参见MySQL 8.0 Online DDL OperationsMySQL 5.7 Online DDL Operations

表空间管理

开关表空间加密。

释放或删除表空间。

丢弃表空间。

删除表

释放或删除表。

Undo操作

释放或删除undo表空间。

刷新表

刷新表及脏页。

Faster DDL解决的缺陷

Faster DDL完美解决了以下MySQL临时缺陷: