提升 TiDB 建表性能
TiDB v7.6.0 引入了系统变量 tidb_ddl_version
实现支持加速建表,可提升大批量建表的速度。从 v8.0.0 开始,该系统变量更名为 tidb_enable_fast_create_table
。
在 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 加速创建的表。
限制
TiDB 加速建表目前仅适用于 CREATE TABLE
语句,且该建表语句不带任何外键约束。
使用方法
你可以通过设置系统变量 tidb_enable_fast_create_table
的值来开启或关闭加速建表的功能。
要开启该功能,将该变量的值设置为 ON
:
SET GLOBAL tidb_enable_fast_create_table = ON;
要关闭该功能,将该变量的值设置为 OFF
:
SET GLOBAL tidb_enable_fast_create_table = OFF;
实现原理
TiDB 加速建表的实现步骤如下:
创建
CREATE TABLE
Job。通过解析
CREATE TABLE
语句生成相应的 DDL Job。执行
CREATE TABLE
Job。由接收该
CREATE TABLE
语句的 TiDB 节点直接执行建表语句,将表结构持久化到 TiKV 中。同时,将CREATE TABLE
Job 标记为已完成,插入到mysql.tidb_ddl_history
表中。同步表信息。
TiDB 通知其他节点同步该新建的表结构。