DDL是怎么保证执行效率的

DDL是怎么保证执行效率的

具体你说的哪种ddl

在线DDL,效率是个整体的,具体问题具体分析,楼主将问题描述清楚一点

同问,之前用mysql一个大表加字段会直接锁表,然后迁数据也比较慢,影响查询,tidb online ddl我理解是不是不会影响查询,但会不会也有数据迁移的问题导致加字段很慢

新增加一个索引

按照执行期间是否阻塞用户业务,DDL 语句可以划分为:

  • 离线 DDL 语句:即数据库接收到用户的 DDL 语句后,会先对要修改的数据库对象进行加锁,再执行元数据变更,在 DDL 执行过程中将阻塞用户业务对数据的修改。
  • 在线 DDL 语句:即数据库在执行 DDL 语句时,通过一定的方法,使得 DDL 执行不阻塞用户业务,且能够保证用户业务可在 DDL 执行期间提交修改,在执行过程中保证对应对象的数据正确性与一致性。

按照是否需要操作 DDL 目标对象所包括的数据来划分,DDL 语句可以划分为:

  • 逻辑 DDL 语句:通常只修改数据库对象的元数据,不对变更对象存储的数据进行处理,例如变更表名或变更列名。在 TiDB 中,逻辑 DDL 语句又被称为 General DDL。General DDL 的执行时间通常较短,只需要几十毫秒或者几秒。执行这类 DDL 语句几乎不消耗系统资源,因此不会影响业务负载。
  • 物理 DDL 语句:不但会修改变更对象的元数据,同时也修改变更对象所存储的用户数据。例如,为表创建索引,不仅需要变更表的定义,同时也需要做一次全表扫描以构建新增加的索引。在 TiDB 中,物理 DDL 被称为 Reorg DDL(Reorg 即 Reorganization)。目前物理 DDL 只包含 ADD INDEX 以及有损列类型变更(例如从 INT 转成 CHAR 类型)这两种类型。物理 DDL 的特点是执行时间较长,且执行时间与表的数据量、机器配置以及业务负载有关。执行物理 DDL 会影响业务负载,具体有两个方面。一方面需要从 TiKV 中读取数据并写入新数据,因此会消耗 TiKV 的 CPU 及 I/O 资源。另一方面,DDL Owner 所在的 TiDB 节点或者被 TiDB 分布式执行框架调度而执行 ADD INDEX 任务的 TiDB 节点需要进行相应的计算,因此会消耗 TiDB 的 CPU 资源。

你说的是新增索引还是变更添加字段还是建表

加索引几乎没有影响

tidb ddl 业务无影响

离线 DDL 语句会先对要修改的数据库对象进行加锁,再执行元数据变更,在 DDL 执行过程中将阻塞用户业务对数据的修改。

是在线ddl,还是离线DDL?