当前位置: 首页 > news >正文

MySQL Online DDL:高性能表结构变更指南

你提供的这段英文内容是 MySQL 官方文档中关于 Online DDL(在线 DDL)性能与并发控制 的详细说明。我们来逐段解析,帮助你深入理解其核心思想和实际意义。


🌟 一、什么是 Online DDL?

Online DDL 是指在执行数据库结构变更(如 ALTER TABLE)时,允许其他查询和写入操作(DML)同时进行,而不需要长时间锁表。

传统方式:ALTER TABLE 会锁住整个表 → 所有读写请求被阻塞 → 用户感知为“卡顿”或“服务中断”。

Online DDL:尽量减少锁,让 DML(INSERT/UPDATE/DELETE)和 SELECT 操作可以继续运行 → 提高系统可用性。


✅ 二、Online DDL 的优势

文档提到了四个关键好处:

优势解释
1. 更高的应用响应性应用可以继续访问表,不会因为 DDL 而“挂起”。
2. 减少资源争用锁更少、等待更少 → 整个数据库的扩展性更好。
3. 避免全表拷贝开销不用像老的 COPY 算法那样复制整个表 → 节省 I/O 和 CPU。
4. 减少缓冲池污染不需要大量读取数据到 buffer pool → 常用热数据不会被挤出去 → DDL 后性能不会突然下降。

👉 这些都指向一个目标:在不影响业务的前提下完成表结构变更


🔐 三、LOCK 子句详解:控制并发级别

你可以通过 LOCK = ... 显式控制 DDL 操作期间允许的并发程度。

LOCK 选项是否允许查询?是否允许 DML?使用场景
LOCK=NONE✅ 是✅ 是关键业务表(如用户注册、订单),不能停服
LOCK=SHARED✅ 是❌ 否数仓类表,可暂停写入但不能停查询
LOCK=DEFAULT自动选择最优自动选择最优默认行为,推荐大多数情况使用
LOCK=EXCLUSIVE❌ 否❌ 否只想最快完成 DDL,且服务器空闲

⚠️ 注意:

  • 如果你指定的 LOCK 比实际支持的还宽松(比如你想用 LOCK=NONE,但该操作必须加排他锁),语句会失败。
  • 推荐先不指定 LOCK,让 MySQL 自动决定。

🔁 四、Online DDL 的三个阶段(含元数据锁机制)

Online DDL 并非完全无锁,而是分阶段加锁,以最小化影响。

阶段 1:初始化(Initialization)

  • 判断是否支持并发(基于存储引擎、语句类型、ALGORITHM、LOCK 设置)。
  • 共享可升级元数据锁(shared upgradable metadata lock) → 防止别人改这个表的结构。

阶段 2:执行(Execution)

  • 准备并执行 DDL。
  • 如果需要排他锁,也只是短暂持有

阶段 3:提交表定义(Commit Table Definition)

  • 升级为 排他元数据锁(exclusive metadata lock) → 替换旧表结构,提交新结构。
  • 这个锁时间很短,但必须等到所有并发事务释放锁后才能获得

📌 关键点:

  • 一个长事务(哪怕只是 SELECT)会持有元数据锁 → 导致 DDL 卡住。
  • 一旦 DDL 请求了排他锁,后续所有对该表的操作都会被阻塞,直到 DDL 完成。

🧪 五、案例演示:锁等待问题

-- Session 1
START TRANSACTION;
SELECT * FROM t1;  -- 持有共享元数据锁-- Session 2
ALTER TABLE t1 ADD COLUMN x INT;  -- 等待排他锁(卡住)-- Session 3
SELECT * FROM t1;  -- 被 Session 2 的等待请求阻塞!

此时:

  • Session 2 在等 Session 1 提交或回滚。
  • Session 3 被 Session 2 “排队挡住了”。

📌 这就是为什么一个简单的 DDL 可能导致整个表“雪崩式”不可用的原因!

🔍 查看方法:

SHOW FULL PROCESSLIST;
-- 或使用 Performance Schema
SELECT * FROM performance_schema.metadata_locks;

⚙️ 六、如何判断 DDL 操作快慢?

文档建议用 rows affected 来判断操作是否高效:

操作示例rows affected说明
快速操作(不涉及数据)ALTER TABLE t1 ALTER COLUMN c1 SET DEFAULT 5;0 rows affected元数据变更,INSTANT
中等操作(不复制表)ALTER TABLE t1 ADD INDEX idx(c1);0 rows affectedINPLACE,但耗时可能长
慢操作(重建表)ALTER TABLE t1 MODIFY c1 BIGINT;1671168 rows affectedCOPY 算法,复制整表

💡 实践建议:

  1. 先克隆一个小表测试 DDL。
  2. 观察 rows affected 是否为 0。
  3. 若非零,说明要复制全表 → 建议在低峰期操作。

📊 七、如何监控 DDL 进度?

使用 Performance Schema 监控:

-- 查看当前阶段
SELECT * FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE 'stage/innodb/alter%';

这能告诉你 ALTER TABLE 到了哪一步(如:排序索引、应用日志等)。


🤔 八、为什么 Online DDL 有时比 COPY 更慢?

这是个反直觉的现象,原因如下:

  • Online DDL 支持并发 DML → 必须记录这些并发修改(称为“log”)。
  • 在 DDL 结束前,要把这些“增量变更”合并回去。
  • 这个过程增加了总耗时。

✅ 但是:

  • 虽然总时间更长,但用户体验更好(页面不卡)。
  • 对比:
    • COPY:快但全程锁表 → 用户卡 30 秒。
    • INPLACE:慢一点但用户几乎无感。

📌 所以,“性能”不只是速度,还包括可用性和响应性


✅ 总结:如何理解这段内容?

核心概念理解要点
Online DDL 的目标在不影响业务的情况下修改表结构
实现方式尽量避免锁表,使用 INPLACE / INSTANT 算法
LOCK 子句控制并发级别,按需选择 NONE / SHARED / EXCLUSIVE
元数据锁(MDL)DDL 最后一步需要排他锁,可能被长事务阻塞
性能判断rows affected:0 表示不复制表,非 0 表示重建表
监控手段SHOW PROCESSLISTperformance_schema 查锁和进度
权衡取舍Online 更稳但可能稍慢;COPY 更快但会中断服务

💡 实际建议(给 DBA 和开发)

  1. 避免长事务,尤其是只读事务不要长时间不提交。
  2. 大表变更前先测试小表,看是否 rows affected > 0
  3. 优先使用 ALGORITHM=INPLACEINSTANT
  4. 生产环境 DDL 加上 LOCK=NONELOCK=SHARED,防止意外锁死。
  5. 监控 MDL 锁等待,及时发现阻塞源头。

如果你有具体的场景(比如:“我想给一个千万级订单表加字段,怎么做?”),我可以进一步给出操作建议。

http://www.dtcms.com/a/418308.html

相关文章:

  • 操作系统:进程调度,创建和终止
  • Kafka09-速答-尚硅谷
  • Jenkins与GitLab-CI的技术对比分析
  • 2025 年 AI 智能体(Agent)发展全景:技术突破、场景落地与产业重构
  • 电子商务的网站建设名词解释网站设计的流程简答题
  • Spark源码中的线程池
  • Kafka06-进阶-尚硅谷
  • TDengine 时序函数 IRATE 用户手册
  • 网站模板源码下载广告网站建设
  • 一键部署 Spring Boot 到远程 Docker 容器
  • Docker 入门:容器化开发的强大工具
  • iOS 26 全景揭秘,新界面、功能创新、兼容挑战与各种工具在新版系统中的定位
  • 北京交易中心网站电商网站建设需要
  • 【ansible/K8s】K8s的自动化部署源码分享
  • C++STL之list
  • CentOS 7安装部署RabbitMQ
  • 本地怎么远程调试服务器
  • AndroidID重置功能开发
  • 【Byte 类型】编程基石:揭开 `Byte`(字节)的神秘面纱
  • 天津做网站哪家服务好北京正邦品牌设计公司
  • 外贸搜素网站android studio开发app实例
  • 5. Prompt 提示词
  • android 自定义样式 Toast 实现(兼容 Android 4.1+~Android 16(API 16))
  • android SharedPreferences 工具类 * 兼容 Android 16+ (API 16)
  • 宁波易通建设网站网站备案信息代码
  • 阿里云OpenLake及行业解决方案年度发布,助力千行百业Data+AI一体化融合
  • 独立站收款方式有哪些
  • 2025 年 Python 数据分析全栈学习路线:从入门到精通的进阶指南
  • 行业类网站应如何建设网站怎么建设以及维护
  • Go 和云原生 的现状和发展前景