字符集为uft8表,修改字段varchar长度锁表分析
字符串的字段是以字节为单位存储的,utf8字符集的表 一个字符需要三个字节,utf8mb4字符集的表 一个字符需要4个字节。对于小于等于255字节以内的长度可以使用一个byte 存储。大于255个字节的长度则需要使用2个byte存储。如果表字段varchar长度从1到85之间变化的话,改字段的存储字节最大也就是255,一个byte足够存储。此时varchar在1到85长度之间变化,是不会锁表的。但是varchar的长度从小于等于85直接修改到大于85的话,此时他的字节数以及大于255了,存储到磁盘需要至少2个byte.此时DDL需要以copy模式,即会锁表,阻塞写操作。
演示如下:
原始字段varchar长度:
** 字段varchar长度从20到85 不存在锁表:**
字段长度:
** 字段varchar 长度从85到86发生锁表:**
字段长度大于86:
main_order_id
varchar(86) NOT NULL COMMENT ‘主订单号’,
** 修改 字段varchar 长度 从86到比86大的数值 也不会发生锁表的问题:**
字符集为utf8mb4 也是一样的。此处不再介绍了,感兴趣的话,可以测试下。