• 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; */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    /** 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、详细测试结果

    DDL操作细节解释版本情况
    删除索引(索引,联合索引,唯一索引(注意不包括主键))不需要rebuild
    更改索引长度,即更改varchar字段长度不需要rebuild5.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.html8.0.12及以上
    更改字段默认值不更改innodb层,所以也是瞬间完成
    重命名表不更改innodb层,所以也是瞬间完成

    ps: 虚拟字段很少用,也就不做详细解释了,另外一个小技巧,如果不确定是否rebuild可以在环境上先测试,norebuild的变更都会在1s之内完成,超过1s的可以直接停掉,不会对业务有什么影响

  • 相关阅读:
    【LeetCode热题100】打开第5天:最长回文子串
    Radius OTP完成堡垒机登录认证 安当加密
    关于iredmail 邮箱
    软件测试工程师必会的银行存款业务,你了解多少?
    Neural Controlled Differential Equations forIrregular Time Series(NIPS2020)
    LiveData常见问题
    基础Python教程之pandas使用总结
    基于Springboot实现网上商城管理系统演示【项目源码+论文说明】
    怎么转换音频格式?建议收藏这几个方法
    leetcode每日一题复盘(10.2~10.8)
  • 原文地址:https://blog.csdn.net/line_on_database/article/details/132698048