功能说明
在5.6版本以前,数据库在执行DDL操作时,会锁表,进而影响线上业务。为了改善情况,mysql后面逐渐引入Online DDL功能并逐步增强其功能,其主要作用是在生产环境中,有业务处理情况下,也可以执行DDL操作且不阻塞其他DML操作。
支持操作
索引:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
创建二级索引 | Yes | No | Yes | No |
删除索引 | Yes | No | Yes | Yes |
索引重命名 | Yes | No | Yes | Yes |
添加全文索引 | Yes* | No* | No | No |
添加空间索引 | Yes | No | No | No |
修改索引类型 | Yes | No | Yes | Yes |
示例:创建二级索引
CREATE INDEX name ON table (col_list);
主键:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
添加主键 | Yes* | Yes* | Yes | No |
删除主键 | No | Yes | No | No |
重建主键 | Yes | Yes | Yes | No |
示例:添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
列:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
添加列 | Yes | Yes | Yes* | No |
删除列 | Yes | Yes | Yes | No |
重命名列 | Yes | No | Yes* | Yes |
调整列顺序 | Yes | Yes | Yes | No |
修改默认值 | Yes | No | Yes | Yes |
修改数据类型 | No | Yes | No | No |
扩展VARCHAR列长度 | Yes | No | Yes | Yes |
删除列默认值 | Yes | No | Yes | Yes |
修改自增值 | Yes | No | Yes | No* |
修改列为空 | Yes | Yes* | Yes | No |
修改列非空 | Yes* | Yes* | Yes | No |
修改ENUM 或SET 列 | Yes | No | Yes | Yes |
示例:添加列
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INPLACE, LOCK=NONE;
生成列:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
添加STORED列 | No | Yes | No | No |
调整STORED列顺序 | No | Yes | No | No |
删除STORED列 | Yes | Yes | Yes | No |
添加VIRTUAL列 | Yes | No | Yes | Yes |
调整VIRTUAL列顺序 | No | Yes | No | No |
删除VIRTUAL列 | Yes | No | Yes | Yes |
示例:添加STORED列
ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
外键:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
添加外键约束 | Yes* | No | Yes | Yes |
删除外键约束 | Yes | No | Yes | Yes |
示例:添加外键约束
ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)
REFERENCES tbl2(col2) referential_actions;
表:
操作 | InPlace | 重建表 | 允许并发DML | 仅修改元数据 |
调整行格式 | Yes | Yes | Yes | No |
调整 KEY_BLOCK_SIZE | Yes | Yes | Yes | No |
设置持久表统计信息 | Yes | No | Yes | Yes |
指定字符集 | Yes | Yes* | Yes | No |
修改字符集 | No | Yes* | No | No |
表优化 | Yes* | Yes | Yes | No |
使用FORCE选项重建表 | Yes* | Yes | Yes | No |
空重建 | Yes* | Yes | Yes | No |
重命名 | Yes | No | Yes | Yes |
示例:调整行格式
ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;