本文介绍云数据库 MySQL 版提供的秒级加列功能的相关信息。
- MySQL 5.7 版本,且内核小版本为 MySQL 5.7.44_20251015 及以上。
- MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。
数据库中的每一行数据均被持久化存储于磁盘之中。当对表执行 ADD COLUMN 操作时,磁盘中的数据也会相应地被修改,所需时间与对应表的大小成正比。因此,在对大表进行 ADD COLUMN 操作时,所花费的时间可能长达数小时甚至数天,这给用户的业务带来了诸多不便。
为了优化这个行为,社区版 MySQL 8.0.12 版本引入了 INSTANT (即时)算法,对部分 ADD COLUMN 操作,不再修改用户原有数据,只需对表元信息进行修改,从而大幅缩小大表加列所需的时间,减少对系统的影响。
为提供更优质的体验,云数据库 MySQL 版将该功能从社区版 MySQL 8.0 移植至 MySQL 5.7 版本。
云数据库 MySQL 版的秒级加列 (Instant Add Column) 功能通过变更数据字典的元数据来优化 ADD COLUMN 操作,避免了传统 DDL 操作对全量表数据的修改或重建,实现加列操作在秒级内完成,且不受表数据量的影响。
云数据库 MySQL 版为 MySQL 5.7 提供了可修改参数 loose_innodb_instant_ddl_enabled 对秒级加列(Instant Add Column)功能进行开启或关闭。在 MySQL 8.0 和 MySQL 8.4 中,秒级加列功能默认开启,不支持修改。
说明
以下内容为在 MySQL 5.7 版本中使用秒级加列功能的方法。MySQL 8.0 和 MySQL 8.4 版本中的秒级加列使用方法与社区版本相同,可参考 MySQL 官方文档。 - 修改参数 loose_innodb_instant_ddl_enabled 为 ON。关于修改实例参数的详细信息,参见修改参数。
- 指定 ALGORITHM=INSTANT 强制使用秒级加列。
- 不指定 ALGORITHM,云数据库 MySQL 版则在运行时根据条件选择最优模式。
MySQL 5.7 版本在 INFORMATION_SCHEMA_INNODB_SYS_TABLES 新增列 INSTANT_COLS,即 INSTANT DDL 执行前,表的原列的个数。
MySQL 5.7 版本在 INFORMATION_SCHEMA 库中新增了 INNODB_SYS_INSTANT_COLUMNS 表,可通过如下 SQL 查看秒级加列功能添加的列信息。
说明
以下内容为在 MySQL 5.7 版本中使用秒级加列功能的注意事项。MySQL 8.0 和 MySQL 8.4 版本中的秒级加列使用方法与社区版本相同,可参考 MySQL 官方文档。 - 仅支持尾部秒级加列,不支持指定 FIRST 或 AFTER 关键字表示定义在某列之前或之后。
- 所加字段不能为自增列 (auto_increment),不能作为主键,不支持虚拟列。
- 执行过秒级加列的表不能执行 flush tables xx for export。
- 执行过秒级加列的表不能执行 alter table xx discard tablespace。
通过对 10GiB 数据量的表进行开启与关闭秒级加列功能的对比测试,开启前后,增加一列的操作时间从 50 秒降至 1 秒以内。