10 行的表、秒级的 INSTANT 加列,也能把服务堵死
ALTER TABLE config ADD COLUMN remark VARCHAR(64), ALGORITHM=INSTANT;表只有 10 行,INSTANT 也只改数据字典、不碰数据,结果服务还是开始报超时。
因为改表快不快和拿锁要不要排队是两回事。INSTANT 加列拿 MDL 的过程:
- 开头拿 SHARED_UPGRADABLE,不挡读写
- 改数据字典,毫秒级
- 提交时升级成 EXCLUSIVE,拿到后立刻改完立刻放
只要有一个没提交的事务占着读锁,第 3 步就要排队。它排在队头时,后面所有新查询都排在它后面,和表多大无关。
对比 INPLACE(比如在线加索引):SU → 短暂 X → 降回 SU 长时间执行(期间别人照常读写)→ 提交时再升 X。INSTANT 没有中间那段长时间执行,但头尾要锁的问题一样存在。