ALTER TABLE 是什么
ALTER TABLE 用于增删列、修改列类型、加删索引与改表选项。执行代价取决于算法:INSTANT 只改元数据几乎瞬时(8.0 支持在线加列等场景),INPLACE 原地重建索引不拷表但仍占用 IO,COPY 需要重建整表并阻塞写入。大表 DDL 会持元数据锁,执行期间可能把主从延迟明显拉长。
基本信息
| 适用版本 | MySQL 5.7 / 8.0;INSTANT 加列需 8.0.12+ |
|---|---|
| 常用动作 | ADD / MODIFY / CHANGE / DROP COLUMN、ADD / DROP INDEX、RENAME |
| 算法选项 | ALGORITHM=INSTANT / INPLACE / COPY |
| 锁选项 | LOCK=NONE 要求允许并发读写,不满足则直接失败 |
| 在线工具 | gh-ost、pt-online-schema-change 用于大表变更 |
典型使用场景
- 新增业务字段:8.0 上优先用 INSTANT 在线加列
- 调整列长度或精度:确认是否会重建表并选择执行窗口
- 补索引:加索引尽量走 INPLACE,避免 COPY 锁写
- 字段下线:先停止写入与读取,再删除,避免应用报错
- 表名切换:RENAME 配合新表创建实现平滑替换
- 大表高流量变更:用 gh-ost 或 pt-online-schema-change 分批迁移
常用操作
常用操作
ALTER TABLE orders ADD COLUMN channel VARCHAR(32) NOT NULL DEFAULT '' AFTER status;
ALTER TABLE orders MODIFY COLUMN sku VARCHAR(128) NOT NULL;
ALTER TABLE orders ADD INDEX idx_channel_created (channel, created_at);
ALTER TABLE orders RENAME TO orders_v2;
-- 在线加列(8.0):显式指定算法,不支持时直接报错
ALTER TABLE orders ADD COLUMN memo VARCHAR(255) NULL, ALGORITHM=INSTANT;
ALTER TABLE orders ADD INDEX idx_memo (memo), ALGORITHM=INPLACE, LOCK=NONE;
SELECT * FROM information_schema.innodb_trx WHERE trx_started < NOW() - INTERVAL 60 SECOND; -- 先确认无长事务三种算法对照
| 算法 | 是否重建表 | 写入影响 |
|---|---|---|
| INSTANT | 否,仅改元数据 | 几乎无影响,毫秒级完成 |
| INPLACE | 否,原地重建索引 | 允许并发 DML,IO 压力上升 |
| COPY | 是,拷贝整表 | 通常阻塞写入,大表耗时很长 |
| 指定 LOCK=NONE | —— | 不满足并发要求时立即失败,避免误锁表 |
大表 DDL 会持 MDL 并可能把复制延迟拖长;生产用 gh-ost 或 pt-online-schema-change,并安排在低峰执行。
DDL 在等待元数据锁时会排在其他会话之前,一旦前面有长事务,整张表的所有读写都会被它堵住;改结构前必须先确认没有长时间运行的事务。
在线 DDL 期间的并发写入会先缓存到 DDL 日志,由 innodb_online_alter_log_max_size 控制上限,超出时整个变更会失败回滚;执行大表变更前先确认这个参数与当前从库延迟。
变更完成后要核对三件事:新结构是否生效(用 SHOW CREATE TABLE 确认)、应用是否兼容(旧代码是否仍在引用被删除的列)、从库是否已经追赶上这次 DDL 带来的延迟。