mysql修改字段的长度锁表问题

mysql修改字段的长度锁表问题

背景

MySQL(这里指5.6及其后续版本=)修改字段的长度锁表会锁表吗?答案是可能会但不一定会

具体原理

  1. MySQL 5.6 及以后版本扩大字段长度 支持 online ddl in-place 模式,而这将不会锁表
  2. varchar 表示可变长字符,所以实际每一行数据中都保存了这字段的实际字节长度,众所周知utf8使用三个字节保存,而utf8mb4使用4个字节,如果字节数小于255则可以使用1btyte保存,而超过255则需要使用2bype保存则就需要修改每一行数据,这将导致锁表

简单来说

  1. 缩小字段长度会导致锁表
  2. 扩展字段长度,如果扩大的字段长度所表示的字节不跨越255将不会锁表,否则锁表

实验

这是使用异常包含两万数据数据的表,字段初始长度为50(使用字符集为utf8)

修改为85(最终最大字节长数为255),耗时28ms,不锁表

在这里插入图片描述

还原回50,耗时3s429ms,锁表(这里根据耗时可以反推出进行了全表更新)

在这里插入图片描述

再次修改为86(字节数跨越了255)耗时3s281ms,锁表

在这里插入图片描述

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值