ALGORITHM=INSTANT用于秒级在线修改已有表结构,非初始化表;需满足InnoDB引擎、非COMPRESSED行格式、无FULLTEXT索引、单操作语句等硬性条件,否则静默降级为INPLACE或COPY。

ALGORITHM=INSTANT 不是用来“初始化”表的,而是用来在线、秒级修改已有表结构的。如果你指的是“新建一张万行级(或更大)的空表”,那根本不需要 DDL 优化——CREATE TABLE 本身毫秒级完成;但如果你实际想表达的是:对一个已承载数万甚至百万行数据的线上业务表,快速加列/删列,且不卡主从、不锁表、不影响读写,那才是 ALGORITHM=INSTANT 的真实战场。
下面直击实操要点:
为什么 CREATE TABLE 后立刻 ALTER ADD COLUMN 还会慢?
新建的表哪怕只有 1 行,只要不满足 ALGORITHM=INSTANT 的硬性条件,ALTER TABLE ... ADD COLUMN 就会退化为 INPLACE 甚至 COPY。常见掉坑点:
- 建表时没显式指定
ROW_FORMAT=DYNAMIC,MySQL 8.0 默认可能用COMPRESSED(尤其在某些云厂商定制镜像里) - 表里加了
FULLTEXT索引(哪怕只有一列),INSTANT直接禁用 - MySQL 版本是 8.0.23,但表是 8.0.12 之前创建的,隐式主键未清理,
INSTANT拒绝生效 - 语句写成
ADD COLUMN x INT, ADD INDEX idx_y(y)—— 多个 DDL 合并在一条语句里,INSTANT自动放弃
如何确认你的表支持 INSTANT 加列?
别猜,直接查元数据。执行完 ALTER TABLE t ADD COLUMN c1 INT DEFAULT NULL ALGORITHM=INSTANT 后,立即运行:
SELECT table_id, name, pos, has_default, default_value FROM information_schema.innodb_columns WHERE table_id = (SELECT table_id FROM information_schema.innodb_tables WHERE name = 'your_db/t') AND name = 'c1';
如果返回一行且 has_default = 1,说明走的是 instant;如果查不到结果,或者报错 ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported,就说明触发了某条限制。
更轻量的验证方式:对一张 100 万行的表执行加列后,立刻 SELECT * FROM t LIMIT 1。如果秒回、新列值为 NULL(或你设的默认值),且 SELECT COUNT(*) 耗时不增,基本可断定是 instant。
带 NOT NULL 的列还能走 INSTANT 吗?
不能,除非默认值是 DEFAULT NULL 或干脆省略 DEFAULT。一旦写 NOT NULL DEFAULT 0 或 NOT NULL DEFAULT 'abc',MySQL 必须确保旧行也满足约束,就得扫描全表补值 → 退化为 INPLACE。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
绕过方法很务实:
- 先加
NULL DEFAULT NULL列(instant 秒级) - 再用
UPDATE分批更新非空值(业务低峰期做,可控) - 最后
MODIFY COLUMN c1 INT NOT NULL(这步仍不支持 instant,但只改元数据,不触碰数据,通常很快)
注意:MODIFY COLUMN 和 CHANGE COLUMN 在任何 MySQL 8.0 版本中都不支持 INSTANT,这是设计死区。
云环境特别要注意 loose_innodb_instant_ddl_enabled
阿里云 RDS、腾讯云 CDB 等托管实例,主从节点的 loose_innodb_instant_ddl_enabled 参数必须一致。若主库为 ON、从库为 OFF,即使语句本身合规,从库回放时也会报 ALGORITHM=INSTANT is not supported 并中断复制。
验证命令:
SHOW VARIABLES LIKE 'loose_innodb_instant_ddl_enabled';
这个变量不是动态的,改完需重启实例(云平台通常提供控制台开关)。生产环境上线前,务必主从都确认。
真正容易被忽略的,不是语法怎么写,而是“表的历史状态”和“云参数一致性”这两层隐形依赖——它们不报错,但会让 INSTANT 静默失效,变成一场缓慢的阻塞。

















