功能介绍
秒级更改列操作只会在数据字典表中记录列修改信息,避免了以往更改列操作时必须做的数据拷贝,从而大幅缩短大表更改列所需的时间,减少对应用系统的影响以及资源的消耗。
支持版本
内核版本 MySQL 8.0 20230630及以上。
适用场景
适用于需要对数据量大的表进行更改列操作的场景。
测试结果
表行数 | 未使用秒级更改列特性变更时长 | 秒级更改列特性变更时长 |
100万 | 22.9秒 | 0.01秒 |
1000万 | 13分39.72秒 | 0.01秒 |
1亿 | 3小时51分16.40秒 | 0.01秒 |
使用说明
秒级更改列语法 ALTER TABLE 新增 algorithm = instant 子句,更改列操作可通过如下语句进行:
ALTER TABLE modify_tab_col MODIFY COLUMN c1 BIGINT,ALGORITHM=INSTANT;
新增参数 cdb_instant_modify_column_enabled 用于控制秒级更改列功能,可以设置为 ON/OFF。
参数名 | 状态 | 类型 | 默认 | 参数值范围 | 说明 |
cdb_instant_modify_column_enabled | yes | bool | OFF | ON/OFF | 功能开关,是否打开秒级更改列功能。 |
说明:
秒级更改列限制
只支持修改列类型,不支持修改字段的 nullable,unsigned/signed,charset,但支持修改 default 属性。
只支持部分类型的修改,且只能增加长度,目前仅支持以下类型的转换:char 和 varchar 之间,binary 和 varbinary 之间,以及 tinyint/smallint/mediumint/int/bigint 之间的相互转换。
例如:
char(10) → char(100)
char(10) → varchar(100)
varchar(10) → char(100)
varchar(10) → varchar(100)
binary(10) → binary(100)
binary(10) → varbinary(100)
varbinary(10) → binary(100)
varbinary(10) → varbinary(100)
tinyint/smallint/mediumint/int → bigint
tinyint/smallint/mediumint → int
tinyint/smallint → mediumint
tinyint → smallint
注意:
不支持 char/varchar 和 binary/varbinary 和 integer 之间的修改,例如,不支持 char → binary,binary → varchar 等。integer 类型需向更大取值范围更改,例如,不支持 bigint → int,int → smallint 等。
单个 column 只能 instant modify 一次,可以同时 instant modify 多个 column。
单个 column 第一次 instant add/modify 后,第二次修改此列只能以非 instant 方式进行。
instant add columns 和 instant modify columns 的操作需要分开执行,可以先执行 instant add columns,再执行 instant modify columns,或先执行 instant modify columns,再执行 instant add columns。不能 instant modify 之前 instant add 的列。
不能同时修改列名和列类型,可以先修改列名再修改列类型。
不支持 import/export。
不支持加密与压缩。