mysql修改字段的长度锁表问题
背景
MySQL(这里指5.6及其后续版本=)修改字段的长度锁表会锁表吗?答案是可能会但不一定会
具体原理
- MySQL 5.6 及以后版本扩大字段长度 支持 online ddl in-place 模式,而这将不会锁表。
- varchar 表示可变长字符,所以实际每一行数据中都保存了这字段的实际字节长度,众所周知utf8使用三个字节保存,而utf8mb4使用4个字节,如果字节数小于255则可以使用1btyte保存,而超过255则需要使用2bype保存则就需要修改每一行数据,这将导致锁表。
简单来说
- 缩小字段长度会导致锁表
- 扩展字段长度,如果扩大的字段长度所表示的字节不跨越255将不会锁表,否则锁表
实验
这是使用异常包含两万数据数据的表,字段初始长度为50(使用字符集为utf8)