TiDB DDL V2 加速建表
从 v7.6.0 开始,TiDB DDL 新版本 V2 实现支持加速建表,可提升大批量建表的速度。
在 TiDB 中,对元数据对象的更改采用的是 online DDL 算法(即在线异步变更算法)。所有的 DDL Job 会提交到 mysql.tidb_ddl_job
表里,由 owner 节点拉取 DDL Job,执行完 online DDL 算法中的各个阶段后,将该 DDL Job 标记为已完成,移入 mysql.tidb_ddl_history
表中。因此 DDL 只能在 owner 节点执行,无法线性拓展。
然而,对于某些 DDL 而言,并不需要严格按照 online DDL 算法执行。如 CREATE TABLE
语句,Job 只有 none
和 public
两个状态,因此可以简化 DDL 的运行流程,使得建表语句可以在非 owner 节点执行,从而实现加速建表。
与 TiDB 工具的兼容性
- TiCDC 暂不支持同步通过 TiDB DDL V2 创建的表。
限制
TiDB DDL V2 目前仅适用于 CREATE TABLE
语句,且该建表语句不带任何外键约束。
使用方法
你可以通过设置系统变量 tidb_ddl_version
的值来开启或关闭 TiDB DDL V2 功能。
要开启该功能,将该变量的值设置为 2
:
SET GLOBAL tidb_ddl_version = 2;
要关闭该功能,将该变量的值设置为 1
:
SET GLOBAL tidb_ddl_version = 1;
实现原理
TiDB DDL V2 加速建表的实现步骤如下:
创建
CREATE TABLE
Job。此步骤和 V1 版本实现相同,通过解析
CREATE TABLE
语句生成相应的 DDL Job。执行
CREATE TABLE
Job。与 V1 版本将 Job 插入
mysql.tidb_ddl_job
表中不同,V2 版本由接收该CREATE TABLE
语句的 TiDB 节点直接执行建表语句,将表结构持久化到 TiKV 中。同时,将CREATE TABLE
Job 标记为已完成,插入到mysql.tidb_ddl_history
表中。同步表信息。
TiDB 通知其他节点同步该新建的表结构。