使用传统方法执行加列操作时,需要重建整个表数据,占用大量系统资源。PolarDB MySQL版支持秒级加字段(Instant add column
)功能,在加列操作时只需变更表定义信息,无需修改已有数据,帮助您快速完成对任意大小表的加列操作。本文介绍如何使用秒级加字段功能。
前提条件
集群版本需为以下版本之一:
PolarDB MySQL版5.6版本且修订版本为5.6.1.0.43或以上,您可以通过查询版本号确认集群的修订版本。
说明PolarDB MySQL版5.6版本的秒级加列功能目前处于灰度阶段,如需使用,请前往配额中心,根据配额ID
polardb_mysql_iac_56
找到配额名称,在对应的操作列单击申请来开通该功能。PolarDB MySQL版5.7版本且修订版本为5.7.1.0.6或以上,您可以通过查询版本号确认集群的修订版本。
说明您需要先配置loose_innodb_support_instant_add_column参数才能在PolarDB MySQL版5.7版本的集群上使用该功能。
PolarDB MySQL版8.0版本。
说明PolarDB MySQL版8.0版本的集群默认支持秒级加字段功能,无需配置任何参数。
使用限制
新增列只能为表的最后一列。
不支持添加虚拟列(PolarDB MySQL版8.0版本支持)。
不支持在分区表上添加列(PolarDB MySQL版8.0版本支持)。
不支持使用了全文索引或列存索引的表。
不支持开启了
Implicit primary key
选项且未自定义主键的表。不支持在同一条SQL中同时执行其它DDL操作和
Instant add column
操作。
使用方法
参数设置
针对PolarDB MySQL版5.6版本和PolarDB MySQL版5.7版本的集群,您需要开启loose_innodb_support_instant_add_column参数来使用秒级加字段功能。如何设置参数值请参见设置集群参数和节点参数。
说明PolarDB MySQL版8.0版本的集群无需配置该参数即可直接使用秒级加字段功能。
参数
级别
说明
loose_innodb_support_instant_add_column
Global
秒级加字段功能的开关,取值范围如下:
ON:开启秒级加字段功能。
OFF(默认):关闭秒级加字段功能。
语句
指定
ALGORITHM=INSTANT
以强制使用秒级加字段功能,语句示例如下:ALTER TABLE test.t ADD COLUMN test_column int, ALGORITHM=INSTANT;
使用上述语句时,若返回
ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
的错误,表示当前加列操作不能以Instant算法执行,建议您查看loose_innodb_support_instant_add_column参数是否已开启,并仔细核对使用限制。不指定
ALGORITHM
或指定ALGORITHM=DEFAULT
,PolarDB会自行选择执行速度最快的算法来执行加列操作,语句示例如下:ALTER TABLE test.t ADD COLUMN test_column int, ALGORITHM=DEFAULT; ALTER TABLE test.t ADD COLUMN test_column int;
说明PolarDB算法选择的优先级为INSTANT > INPLACE > COPY。
查看通过Instant算法增加的列信息
对于PolarDB MySQL版5.6版本和PolarDB MySQL版5.7版本,
INFORMATION_SCHEMA
数据库中新增了INNODB_SYS_INSTANT_COLUMNS
表。该表记录了使用Instant算法增加的列信息,例如列名、列序号和默认值(二进制方式存储)等。您可通过如下语句查看该表详情来确认新增的列信息。SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INSTANT_COLUMNS;
说明对目标表使用了Instant算法增加列后,如果执行了需要重建表的DDL操作(如DROP COLUMN),系统将会删除
INNODB_SYS_INSTANT_COLUMNS
表中目标表的相关列信息。对于PolarDB MySQL版8.0版本,您可通过如下语句查看表的列信息,若查询结果中
has_default
列为1,则说明该列是通过Instant算法增加的。SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = (SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "test/t1");
联系我们
若您对DDL操作有任何疑问,请联系我们。