MariaDB为现有非空列添加DEFAULT约束耗时过长问题咨询
MariaDB添加DEFAULT约束耗时过长的原因分析
问题场景
- 环境:MariaDB 10.6.17-MariaDB-1:10.6.17+maria~deb11-log,InnoDB引擎
- 表结构:
my_table含20k行数据,external_id列定义为int(11) NOT NULL,无DEFAULT约束 - 执行的DDL:
ALTER TABLE my_table MODIFY COLUMN external_id int(11) DEFAULT 0 NOT NULL;
- 现象:仅需新增默认值(不修改现有数据),但语句执行耗时极长
原因解析
这是MariaDB 10.6版本中InnoDB引擎对MODIFY COLUMN语法的处理特性:
- 虽然逻辑上添加DEFAULT只是修改表元数据(不涉及现有行数据变更),但
MODIFY COLUMN会被引擎判定为“列定义修改”,触发全表重建操作——即遍历所有行并重新写入,这才导致20k行也耗时很久。 - 本质是
MODIFY COLUMN是通用的列定义修改语法,引擎默认会走表重建流程,而非仅修改元数据。
解决方案
改用专门用于设置默认值的语法,这条语句仅修改表元数据,不会触发全表重建,执行瞬间完成:
ALTER TABLE my_table ALTER COLUMN external_id SET DEFAULT 0;
验证方式
可以通过以下方式确认差异:
- 执行DDL时用
SHOW PROCESSLIST查看进程状态:MODIFY COLUMN会显示altering table并持续运行,ALTER COLUMN SET DEFAULT则瞬间完成 - 查看
information_schema.TABLES中的UPDATE_TIME字段,前者会更新为当前时间(表重建),后者仅修改元数据,不会更新该字段
内容的提问来源于stack exchange,提问作者P. Kouvarakis
相关产品推荐
相关产品推荐

