mysql-norebuild的ddl测试

一、简介

为了保证需要注意的有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的可以直接停掉,不会对业务有什么影响

你可能感兴趣的:(mysql,mysql,数据库)