首页/数据/数据库速查/ALTER TABLE 修改表结构
SQL 语法52 条

ALTER TABLE 修改表结构

增删列、改类型、加索引、改表选项;8.0 支持 ALGORITHM=INSTANT 在线加列,但多数变更仍需重建表并影响写入。

数据库速查数据更新于 2026-10-13

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 带来的延迟。

易错点

  • 大表直接 ALTER,走 COPY 算法锁表数小时,业务写入全部超时
  • DDL 排队等 MDL,被之前的长事务卡住,后续所有查询一起被阻塞
  • 加列忘记给 NOT NULL 字段默认值,已有行数据校验失败或写入报错
  • 变更前未核对从库延迟,DDL 在从库串行回放导致复制延迟骤增
  • 用 RENAME 切换新表时未处理外键与应用缓存,切换后出现找不到表或旧数据

数据来源与参考

  • MySQL 8.0 Reference Manual: ALTER TABLE Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌