Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Mysql OnlineDDL

深入理解Mysql OnlineDDL的算法

作者:码上库里南

本文主要介绍了讲解Mysql OnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MySQL 5.6 及以后版本(尤其是 InnoDB 存储引擎)引入的一项极其重要的功能,它允许数据库管理员在执行 ALTER TABLE 操作时,最大程度地减少对表锁定和应用程序可用性的影响

核心目标: 在 DDL 操作进行时,允许对表进行并发读取(SELECT) 和写入(INSERT, UPDATE, DELETE) 操作。

一、Online DDL 是什么?

Online DDL 是 MySQL 5.6 版本引入,并在后续版本中不断增强的一项功能。它允许你在执行数据定义语言(DDL)操作时(如 ALTER TABLE),尽可能地减少对表的锁定时问,使得:

这与早期的 Copy Table 机制形成鲜明对比,早期方式需要全程锁表,直到操作完成,对于大表来说意味着长时间的停机。

二、Online DDL 的三种主要算法

MySQL 在执行 DDL 时,根据操作类型的不同,底层主要采用三种算法。理解这些算法是理解 Online DDL 的关键。

2.1COPY(复制法)

过程:

特点

2.2 INPLACE (原地法)

过程

无需创建临时表文件,直接在原始表的存储文件(如 InnoDB 的 .ibd 文件)上进行操作。

通常分为两个阶段:

特点

2.3INSTANT (即刻法,MySQL 8.0+)

过程

特点

三、Online DDL 的锁机制

即使是 INPLACE 算法,也并非全程无锁。Online DDL 涉及两种主要的锁:

关键点:Online DDL 的“Online”体现在其耗时的数据拷贝/重建阶段(Execute阶段)是不锁表的,而只在元数据变更的瞬间需要短暂的排他锁。这个瞬间通常非常短,可以忽略不计。

四 关键区别

特性COPYINPLACEINSTANT
核心方式重建整个表原地修改,避免重建整个表仅修改元数据
锁表时间长 (全程锁或长写锁)短 (准备/提交锁)极短 (毫秒级元数据锁)
执行阶段不允许读写允许并发读写允许并发读写
空间占用双倍表空间额外日志/临时文件空间几乎无额外空间
速度中等 (取决于操作复杂度)极快 (毫秒级)
并发影响高 (停机)低 (短暂阻塞写)极低 (几乎无感知)
主要优势兼容性平衡性能和并发瞬时完成,零感知
典型操作部分无法 INPLACE 的操作 (如删除主键)添加/删除索引、修改列属性等添加/删除列 (有条件)、改默认值

4.1 生动的比喻:给飞行中的飞机换引擎

想象一下,你要给一架正在飞行的飞机更换引擎(这相当于对数据库表做 ALTER TABLE)。

COPY 算法:让所有乘客下飞机(阻塞 DML),把飞机拖进机库,拆下旧引擎,换上新引擎,最后再让乘客登机。在此期间,飞机完全停运

INPLACE 算法

4.2 如何指定和查看算法

指定算法: 在 ALTER TABLE 语句中使用 ALGORITHM 子句。

ALTER TABLE your_table ADD COLUMN new_col INT, ALGORITHM=INSTANT; -- 尝试强制使用 INSTANT
ALTER TABLE your_table ADD INDEX idx_name (col_name), ALGORITHM=INPLACE, LOCK=NONE; -- 尝试强制 INPLACE 且无锁

指定锁策略: 使用 LOCK 子句。

ALTER TABLE ... LOCK=NONE; -- 尽可能允许并发读写 (最高并发)
ALTER TABLE ... LOCK=SHARED; -- 允许读,阻塞写
ALTER TABLE ... LOCK=EXCLUSIVE; -- 阻塞读写 (传统方式)
ALTER TABLE ... LOCK=DEFAULT; -- 让 MySQL 选择最小必要的锁策略

指定的 LOCK 级别必须兼容于操作本身支持的级别。例如,一个操作在 INPLACE 执行阶段允许 LOCK=NONE,但你强制指定 LOCK=EXCLUSIVE 是允许的(虽然不推荐)。反之,如果操作本身在某个阶段必须短暂加 EXCLUSIVE 锁,你指定 LOCK=NONE 会导致语句失败。

查看算法和锁: 执行 ALTER TABLE 前,使用 ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONE 并加上 NO_WRITE_TO_BINLOG 和 COMMIT 子句通常不会真正执行,MySQL 会检查并报告它将使用的算法和锁。更好的方法是查询 INFORMATION_SCHEMA.INNODB_TABLES 或使用 SHOW CREATE TABLE 观察进度(对于长时间操作),或者直接执行后观察输出信息(很多客户端会显示使用的算法)。最准确的是查看官方文档对具体操作的支持矩阵。

4.3 重要注意事项

三、总结

MySQL 的 Online DDL 通过 COPYINPLACEINSTANT 三种算法,极大地提升了 DDL 操作的并发性和可用性。尤其是 INSTANT 算法(MySQL 8.0+)对于支持的列操作实现了近乎瞬时的变更,对在线业务影响最小。INPLACE 算法则是大多数索引和列操作的主力,在执行阶段允许并发读写。COPY 算法作为最后的选择,应尽量避免。

最佳实践:

到此这篇关于深入理解Mysql OnlineDDL的算法的文章就介绍到这了,更多相关Mysql OnlineDDL 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文