Online DDL

最近更新时间:2026-02-05 11:01:13

我的收藏

概述

Online DDL(Online Data Definition Language)旨在对数据库表结构进行修改时,仍能支持并发读写操作,降低了对表的锁定时间,保障了数据库的可用性。在分布式环境中,DDL 操作需要在多个节点上同时进行,不仅需要保证 DDL & DML 操作并发的安全性,同时还要考虑性能、执行效率以及 crash-safe 问题。

工作原理

Online DDL 能力

TDSQL Boundless 已经支持大多数场景下的 Online DDL 能力,详细请参考 Online DDL 说明

使用示例

# 创建测试表
CREATE TABLE sbtest1 (id int primary key, v1 int);
# 插入测试数据
INSERT INTO sbtest1 (id, v1) values (1,1), (2,2), (3,3);
# Online 添加索引
ALTER TABLE sbtest1 ADD INDEX idx_v1(v1);
# Online 添加列
ALTER TABLE sbtest1 ADD COLUMN v2 int;

大数据量表创建索引使用建议

TDSQL Boundless 的 Fast Online DDL 能力,通过并行处理和旁路写入相结合,使得 DDL 操作变得更加高效和便捷。
但如果我们没有正确地划分大/小表,或者没有根据数据规模进行适当的分区,那么 Fast Online DDL 的执行效率可能会大打折扣。这是因为一张大表,在没有进行适当分区的情况下,数据很可能都集中在单个节点上,因此 DDL 操作也会在单个节点上进行,而不是在多个节点上并行执行,这将大大降低执行效率。
只有根据数据规模合理地使用分区表,才能充分发挥 Fast Online DDL 的分布式可扩展性能。
创建分区建议:
1. TDSQL Boundless 100% 兼容原生 MySQL 分区表语法,支持一/二级分区,主要用于解决:(1)大表的容量问题;(2)高并发访问的性能问题。
2. 大表的容量问题:如果单表大小预期未来将超过实例单节点数据盘大小,建议创建一级 hash 或 key 分区将数据均匀打散到多个节点上;如果未来数据量再增大,可通过弹性扩容的方式不断“打薄”磁盘水位。
3. 高并发访问的性能问题:高并发访问 TP 业务,如果预计单节点性能无法扛住超量读写压力的时候,也建议创建一级 hash 或 key 分区将读写压力均匀打散到多个节点上。
4. 第2、第3点中创建的分区表,建议结合业务特点选择能满足大部分核心业务查询的字段作为分区键,分区数建议为实例节点数量的倍数。
5. 如果有数据清理的需求,可创建 RANGE 分区表使用 truncate partition 命令进行快速数据清理;如果要兼顾数据打散,可进一步创建二级分区为 HASH 的分区表。

相关参数

参数名
默认值
说明
tdsql_ddl_fillback_mode
ThomasWrite
Online DDL 过程中,数据回填阶段采用的算法。
ThomasWrite:默认算法,忽略过期写入的算法。
IngestBehind:基于 bulk load 方式写入的回填算法。
max_parallel_ddl_degree
8
控制 Online DDL 数据回填阶段的最大并行度。
增加此值可加快数据回填速度,但会消耗更多的 CPU、I/O 和内存资源。可根据服务器硬件配置和业务负载进行调整。