COPY、INPLACE、INSTANT:ALTER 期间别人还能干什么
| 算法 | 怎么做 | 期间别人能 |
|---|---|---|
| COPY | 拷一张新表,再换过来 | 只能读 |
| INPLACE | 在引擎内部重建,或只建索引 | 读写 |
| INSTANT(8.0.12 起) | 只改数据字典,老数据不动 | 读写,秒级完成 |
可以在语句里指定算法,做不到时 MySQL 会直接报错,而不是悄悄降级:
ALTER TABLE d ADD INDEX iv(v), ALGORITHM=INSTANT;
-- ERROR: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
ALTER TABLE d MODIFY v BIGINT, ALGORITHM=INPLACE;
-- ERROR: Cannot change column type INPLACE. Try ALGORITHM=COPY.所以在线上改表时,养成显式写上 ALGORITHM 的习惯:不支持就当场报错,不会意外变成锁表的 COPY。
大致规律:只改定义的(加列、改默认值)能 INSTANT;要动数据的(建索引、改主键、改可空、重建表)走 INPLACE;改列类型、改字符集至今只能 COPY。