TECH NOTES / 中间件与数据
MySQL 大表在线 DDL 笔记
原笔记 2022-01-08 · 整理于 2026-10-05
记录 MySQL 在线 DDL 语句,区分算法选择、并发写入和元数据锁。
操作说明:Online DDL 不等于全程无锁。INPLACE 仍可能重建表,开始或结束阶段仍可能等待元数据锁;不同操作对 LOCK=NONE 的支持不同。先在相同版本与表结构下验证,并准备回退方案。
各种DDL
添加字段
ALTER TABLE `rmb_order_item` ADD COLUMN `asset_snapshot` varchar(5000) NOT NULL DEFAULT '' COMMENT '设备快照' AFTER `item_snapshot`, ALGORITHM=INPLACE, LOCK=NONE;添加主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`) ,Algorithm=Inplace ;添加唯一索引
ALTER TABLE `table_name` ADD UNIQUE (`column`) ,Algorithm=Inplace ;添加全文索引
ALTER TABLE `table_name` ADD FULLTEXT (`column`),Algorithm=Inplace ;添加普通索引
ALTER TABLE `table_name` ADD KEY `table_cloum`(`table_cloum`) USING BTREE,Algorithm=Inplace ;添加组合索引
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`),Algorithm=Inplace ;索引命名
唯一索引:
udx_<tablename>_<column1>_..._<columnN>普通索引:
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