TECH NOTES / 中间件与数据

MySQL 大表在线 DDL 笔记

原笔记 2022-01-08 · 整理于 2026-10-05

记录 MySQL 在线 DDL 语句,区分算法选择、并发写入和元数据锁。

操作说明:Online DDL 不等于全程无锁。INPLACE 仍可能重建表,开始或结束阶段仍可能等待元数据锁;不同操作对 LOCK=NONE 的支持不同。先在相同版本与表结构下验证,并准备回退方案。

各种DDL

添加字段

sql
ALTER TABLE `rmb_order_item` ADD COLUMN `asset_snapshot` varchar(5000) NOT NULL DEFAULT '' COMMENT '设备快照' AFTER `item_snapshot`, ALGORITHM=INPLACE, LOCK=NONE;

添加主键索引

sql
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`) ,Algorithm=Inplace ;

添加唯一索引

sql
 ALTER TABLE `table_name` ADD UNIQUE (`column`) ,Algorithm=Inplace ;

添加全文索引

sql
ALTER TABLE `table_name` ADD FULLTEXT (`column`),Algorithm=Inplace ;

添加普通索引

sql
 ALTER TABLE `table_name`  ADD KEY `table_cloum`(`table_cloum`) USING BTREE,Algorithm=Inplace ;

添加组合索引

sql
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`),Algorithm=Inplace ;

索引命名

唯一索引:

sql
udx_<tablename>_<column1>_..._<columnN>

普通索引:

sql
idx_<tablename>_<column1>_..._<columnN>

注意事项

alter在新增全文索引的时候长时间不释放,导致出现大量的DML锁;这种大表修改表结构的时候速度很慢

普通的做法是复制表结构,修改表结构,再导入数据,删除表,重命名;但是这样在写入频率非常高的订单表中容易造成数据丢失。

MySQL 官方文档:Online DDL 支持范围

Algorithm=Inplace :要求使用 INPLACE 算法;部分操作仍会重建表并产生空间、I/O 开销。如果 DDL 操作不支持 Algorithm=Inplace 方式,DDL 操作会立刻返回错误。

Lock=None :要求支持并发 DML,但不代表没有元数据锁等待。如果 DDL 操作不支持 Lock=None (允许并行 DML 操作)选项,DDL 操作会立刻返回错误。

原文链接:https://blog.csdn.net/cby1516/article/details/101053769

文章配图