Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • Keydb

  • TiDB

    • TiCDC同步数据到Kafka
    • 对TiDB中算子的深入理解
    • TiDB使用 TTL (Time to Live) 定期删除过期数据
    • 如何移除TiDB中的表分区
    • TiDB配置文件调优
    • 深入解析TiFlash:原理、适用场景与调优实践
    • tidb fast ddl
      • 1. 概述
      • 2. TiDB DDL 基本原理
      • 3. Fast DDL 的实现原理
        • 3.1 分布式执行框架
        • 3.2 本地临时存储
        • 3.3 并行处理能力优化
      • 4. Fast DDL 工作流程拆解 (以 ADD INDEX 为例)
      • 5. 配置和使用 Fast DDL
        • 5.1 启用 Fast DDL
        • 5.2 调整相关参数
        • 5.3 临时目录配置
      • 6. 支持的 DDL 操作
      • 7. 性能对比
        • 7.1 与其他数据库系统对比
        • 7.2 版本间性能提升
      • 8. 适用场景
      • 9. 监控与诊断
        • 9.1 查看 DDL 任务
        • 9.2 Grafana 监控面板
        • 9.3 常见问题排查
      • 10. 限制和注意事项
      • 11. 最佳实践
  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • TiDB
Carry の Blog
2025-04-04
目录

tidb fast ddl

# TiDB Fast DDL

# 1. 概述

Fast DDL 是 TiDB 推出的一项重要优化技术,旨在解决传统 DDL 操作执行慢、阻塞业务的问题。通过 Fast DDL,TiDB 实现了在线 DDL 变更的性能大幅提升,可以在不影响业务正常运行的情况下快速完成表结构变更操作。

从 TiDB v6.5.0 版本开始,Fast DDL 功能已经默认开启,为用户带来显著的性能提升:

  • 与早期版本相比,DDL 操作性能提升了约 10 倍
  • 在 v8 版本中,建表速度相比 v7.5 提升了约 50 倍
  • 启用 Fast Create Table 优化后,DDL 操作的 QPS 可提升一倍

# 2. TiDB DDL 基本原理

TiDB DDL 模块通过引入 DDL Owner 角色来代理执行所有进入 TiDB 集群中的 DDL 语句。在同一时间,整个 TiDB 集群中只有一个 TiDB 节点能当选为 Owner。当选 Owner 后,该 TiDB 节点中启动的 worker 才能处理集群中的 DDL 任务。

TiDB DDL 操作可分为两大类:

  1. General DDL 语句:仅涉及元数据修改的 DDL 语句,执行速度很快。
  2. Reorg DDL 语句:需要重组(Reorganize)数据的 DDL 语句,如添加索引、修改列类型等,这类操作是 Fast DDL 主要优化的对象。

# 3. Fast DDL 的实现原理

Fast DDL 主要通过以下几个方面实现性能提升:

# 3.1 分布式执行框架

Fast DDL 采用分布式执行框架,将一个 DDL 任务拆分成多个子任务,调度到不同的 TiDB 节点上并行执行,大幅提高执行效率。特别是对于添加索引等耗时操作,效果显著。

# 3.2 本地临时存储

在执行 ADD INDEX 等操作时,Fast DDL 会利用执行节点的本地磁盘作为临时存储空间(RocksDB an instance),用于存储排序后的索引键值对。这避免了将中间数据写入 TiKV,减少了网络传输和分布式事务的开销,从而提高了数据处理速度。

# 3.3 并行处理能力优化

通过增强并行处理能力,Fast DDL 可以同时处理更多的数据,特别是在大表上执行 DDL 操作时,性能提升明显。

# 4. Fast DDL 工作流程拆解 (以 ADD INDEX 为例)

一个典型的 ADD INDEX 任务在 Fast DDL 模式下主要经历以下阶段:

  1. 扫描数据 (Scan):DDL Owner 会创建一个分布式执行计划,将表的行数据(主键和索引列)扫描任务分发给多个 TiDB 节点。每个节点负责扫描表的一部分数据。
  2. 本地排序 (Sort):每个执行节点将扫描到的数据在本地临时目录中进行排序,生成有序的中间文件。
  3. 数据导入 (Ingest):所有执行节点完成本地排序后,DDL Owner 会通知这些节点将排好序的索引数据直接导入到对应的 TiKV Region 中。这个过程被称为 "Ingest",它绕过了传统的写入路径,效率极高。
  4. 校验索引 (Validate):数据导入完成后,系统会校验索引数据的一致性,确保新创建的索引是准确无误的。
  5. 更新元数据 (Update Metadata):校验通过后,DDL Owner 会更新表元数据,将索引状态置为可用 (Public),整个 DDL 操作完成。

# 5. 配置和使用 Fast DDL

# 5.1 启用 Fast DDL

从 TiDB v6.5.0 开始,Fast DDL 功能默认开启。可以通过以下系统变量控制:

-- 启用 Fast Online DDL 模式
SET GLOBAL tidb_ddl_enable_fast_reorg = ON;  -- 默认已开启
1
2

# 5.2 调整相关参数

可以通过调整以下参数优化 Fast DDL 的性能:

-- 控制 DDL 操作的并发度
SET GLOBAL tidb_ddl_reorg_worker_cnt = 16;  -- 默认值取决于系统配置

-- 控制快速模式可使用的本地磁盘最大配额 (所有 DDL 任务共享)
SET GLOBAL tidb_ddl_disk_quota = '100G';  -- 默认 100GB

-- 控制单个 DDL 任务可使用的最大内存
SET GLOBAL tidb_ddl_reorg_batch_size = 2048; -- 默认值
1
2
3
4
5
6
7
8

# 5.3 临时目录配置

对于 TiDB On-Premise 集群,可以通过 TiDB 的配置文件参数 --temp-dir 指定临时文件存储目录。确保该目录所在磁盘有足够的空间和 I/O 性能。

# 6. 支持的 DDL 操作

目前,Fast DDL 主要加速以下 Reorg DDL 操作:

  • ADD INDEX / ADD PRIMARY KEY
  • MODIFY COLUMN / CHANGE COLUMN (当涉及列类型转换时)
  • ALTER TABLE ... REORGANIZE PARTITION

对于 DROP INDEX、ADD COLUMN (不带默认值) 等不涉及大量数据重组的操作,本身执行速度较快,不通过 Fast DDL 框架。

# 7. 性能对比

# 7.1 与其他数据库系统对比

TiDB 的 Fast DDL 在性能测试中展现出明显优势:

  • 与 Aurora、CockroachDB 相比,TiDB Cloud 的 Online DDL 性能更优。
  • 与 OceanBase 相比,TiDB 的 DDL 操作也具有竞争力。

# 7.2 版本间性能提升

  • TiDB v6.5 版本的 Fast DDL 性能比之前版本提升约 10 倍。
  • TiDB v8 版本建表速度比 v7.5 版本提升约 50 倍。

# 8. 适用场景

Fast DDL 特别适用于以下场景:

  1. 大表结构变更:对大表添加索引或字段时,Fast DDL 可以显著减少操作时间。
  2. 高并发业务环境:在线 DDL 变更不会阻塞业务正常运行。
  3. 多租户大规模部署:支持百万级别表的高效管理。
  4. 频繁的表结构调整:快速响应业务需求变化,支持敏捷开发。

# 9. 监控与诊断

# 9.1 查看 DDL 任务

可以通过 ADMIN SHOW DDL JOBS 命令查看当前正在运行或历史的 DDL 任务详情。

ADMIN SHOW DDL JOBS;
1

关注 STATE 和 SCHEMA_STATE 字段,了解任务进展。

# 9.2 Grafana 监控面板

在 TiDB 的 Grafana 监控中,TiDB -> DDL 面板提供了丰富的监控项:

  • DDL Job By State:查看处于不同状态的 DDL 任务数量。
  • DDL Add Index Progress:监控添加索引任务的进度。
  • DDL Reorg Worker Count:查看 Reorg worker 的数量。
  • DDL Temp Disk Usage:监控 Fast DDL 使用的临时磁盘空间。

# 9.3 常见问题排查

  • 临时磁盘空间不足:如果 Grafana 显示 DDL Temp Disk Usage 达到配额,DDL 任务会暂停。此时需要增加 tidb_ddl_disk_quota 或清理磁盘空间。
  • DDL 任务卡住:检查 ADMIN SHOW DDL JOBS 的状态,并查看相关 TiDB 节点的日志文件 (tidb.log),搜索 DDL 关键字以获取详细错误信息。

# 10. 限制和注意事项

使用 Fast DDL 时需要注意:

  1. 临时空间需求:Fast DDL 需要足够的本地磁盘空间作为临时存储。
  2. 资源消耗:高并发的 DDL 操作可能会消耗较多 CPU、内存和磁盘 I/O。
  3. 兼容性:某些特殊类型的 DDL 操作可能不适用于 Fast DDL 模式。
  4. 监控:建议在执行大型 DDL 操作时密切监控系统资源使用情况。

# 11. 最佳实践

  1. 合理设置并发度:根据系统资源情况调整 tidb_ddl_reorg_worker_cnt 参数。
  2. 预估磁盘空间:确保 tidb_ddl_disk_quota 设置合理,避免空间不足。
  3. 选择低峰期:尽量在业务低峰期执行大型 DDL 操作,以减少对业务的影响。
  4. 分批执行:对于超大表,考虑将 DDL 操作分批执行。
  5. 提前测试:在生产环境应用前,在测试环境验证 DDL 操作的执行时间和影响。
#DDL#TiDB
上次更新: 6/21/2025

← 深入解析TiFlash:原理、适用场景与调优实践 MongoDB 集群的安装部署详细流程→

最近更新
01
表空间管理与回收
06-21
02
MySQL抖动刷脏页
06-21
03
count函数详解
06-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式