一、简介
为了保证需要注意的有norebuild和ignore两种
/** Operations that InnoDB cares about and can perform without rebuild */
static const Alter_inplace_info::HA_ALTER_FLAGS INNOBASE_ALTER_NOREBUILD= INNOBASE_ONLINE_CREATE| INNOBASE_FOREIGN_OPERATIONS| Alter_inplace_info::DROP_INDEX| Alter_inplace_info::DROP_UNIQUE_INDEX| Alter_inplace_info::RENAME_INDEX| Alter_inplace_info::ALTER_COLUMN_NAME| Alter_inplace_info::ALTER_COLUMN_EQUAL_PACK_LENGTH| Alter_inplace_info::ALTER_INDEX_COMMENT| Alter_inplace_info::ADD_VIRTUAL_COLUMN| Alter_inplace_info::DROP_VIRTUAL_COLUMN| Alter_inplace_info::ALTER_VIRTUAL_COLUMN_ORDER| Alter_inplace_info::ALTER_COLUMN_INDEX_LENGTH;/* | Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE; */
/** Operations for altering a table that InnoDB does not care about */
static const Alter_inplace_info::HA_ALTER_FLAGS INNOBASE_INPLACE_IGNORE= Alter_inplace_info::ALTER_COLUMN_DEFAULT| Alter_inplace_info::ALTER_COLUMN_COLUMN_FORMAT| Alter_inplace_info::ALTER_COLUMN_STORAGE_TYPE| Alter_inplace_info::ALTER_VIRTUAL_GCOL_EXPR| Alter_inplace_info::ALTER_RENAME;
二、详细测试结果
DDL操作 | 细节解释 | 版本情况 |
---|---|---|
删除索引(索引,联合索引,唯一索引(注意不包括主键)) | 不需要rebuild | |
更改索引长度,即更改varchar字段长度 | 不需要rebuild | 5.7.23及以后 |
更改索引注释 | 不需要rebuild ,但是alter table语句没有modify index的操作,所以无法验证 | |
字段重命名 | 不需要rebuild ,以change来实现 | |
字段长度变更(数值) | 数值类型(tinyint,int,bigint的括号内的内容并不代表长度,只是会在fill zero的情况在左侧补充0而已)不需要rebuild | |
字段长度变更(float) | 不需要rebuild(增加或缩减整数位,小数位都是norebuild) | |
字段长度变更(decimal) | copy | |
字段长度变更(char) | copy | |
字段长度变更(varchar) | 同字节(0-255(utf8/3,utf8mb4/4),256-65535)内增加长度不需要rebuild, 缩减长度需要copy | |
ENUM,SET字段定义内容变更 | 添加元素不需要rebuild(enum(“a”) -> enum(“a”,“b”)),缩减元素copy | |
加字段 | 8.0.12及以上增加了ALGORITHM=INSTANT,添加列不需要rebuild了,详细可查看官网https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html | 8.0.12及以上 |
更改字段默认值 | 不更改innodb层,所以也是瞬间完成 | |
重命名表 | 不更改innodb层,所以也是瞬间完成 |
ps: 虚拟字段很少用,也就不做详细解释了,另外一个小技巧,如果不确定是否rebuild可以在环境上先测试,norebuild的变更都会在1s之内完成,超过1s的可以直接停掉,不会对业务有什么影响