当前位置: 首页 > news >正文

MySQL字段长度修改 锁表情况分析

前言

最近发现有一个780w左右的表的某个字段长度设置不合理,导致数据无法插入 , 于是计划修改长度。 担心会锁表阻塞业务所以选择晚上执行修改, 结果在晚上发现这个修改是秒生效, 并没有阻塞数据库,于是分析下原因。

字段content修改前类型是varchar(255) 字符编码是utf8mb4。 修改成varchar(2048)

MySQL的行存储格式

mysql的每行数据的默认存储格式是dynamic, 但是dynamic格式和compact格式差异不大, 本文以 compact的行格式说明问题, compact的行格式如下:
在这里插入图片描述
头部有一个变长字段列表, 其中存储的是这一行中变长字段的长度。

比如我content字段之前是varchar(255). 而utf8mb4每个汉字4个字节表示, content存满后的长度是1020字节, 在头部就需要存储一个数字1020, 所以头部中有两个字节是用来表示content的长度的。

现在我把长度改成了varchar(2048), 修改后存满需要8192字节, 还是只需要两个字节来表示这个长度, 因此每一行记录的变长字段部分不需要修改。

总结

  1. mysql的compact的行格式中每行头部会开辟对应的空间来存储变长字段长度值。
  2. 如果修改变长字段的长度 导致行头部已有的空间不够表达字段长度了, 就会修改每一行的头部
  3. 在修改每一行的头部的时候就会锁住全表。
  4. 如果修改的字段的长度, 头部现有的空间依旧可以满足变长字段长度的表示需要, 则不会修改每一行数据, 就不会锁表了。

相关文章:

  • 探索人工智能的未来趋势
  • POI生成Excel文件增加数据验证(下拉序列)
  • ELK 架构中 ES 性能优化
  • SpringBoot项目用Aspose-Words将Word转换为PDF文件正常显示中文的正确姿势
  • 在代码平台怎么拉取对应分支的项目,并且创建属于自己的分支
  • 内存卡提示格式化怎么办?轻松应对格式化
  • 【C++私房菜】序列式容器的迭代器失效问题
  • 深度学习中数据的转换
  • [FT]chatglm2微调
  • Android 使用NanoHTTPD 架设 Http Server + 客户端App 发送请求示例(含上传图片示例)
  • 设计模式学习笔记 - 面向对象 - 6.为什么要基于接口而非实现编程?有必要为每个类都定义接口吗?
  • 使用和管理jupyter notebook, anaconda环境下在jupyter使用自己创建的虚拟环境,怎么删除jupyter其他内核
  • 蓝桥杯备赛Day2——知识拾遗
  • 嵌入式软件开发为什么需要DevOps?
  • 艾美捷游离巯基检测试剂盒基本参数和特点说明
  • python基础(15):面向对象编程
  • 【RocketMQ】RocketMQ实例--定时/延时消息
  • Redis 中主从、哨兵和集群这三种模式有什么区别 ?
  • 数据库MYSQL及MYSQL ODBC
  • 华为机试 - 猜字谜
  • Windows下的通用进程守护程序(持续更新中),高仿supervisor。
  • 认证AAA的好处及必要性
  • Chrome谷歌浏览器清空缓存并强制刷新页面
  • 有了 HTTP,为什么还要 RPC?
  • 蓝桥杯:跳越
  • 05第二章:04_使用通用 Mapper
  • 二苯并环辛炔-聚乙二醇-CY5.5;DBCO-PEG-CY5.5简介;DBCO-PEG-Cyanine5.5 激发/发射波长为 675 nm/694 nm
  • 【关于eps8266自动重启 Soft WDT reset】
  • QEMU环境搭建
  • SetWindowLongPtr之GWLP_USERDATA
  • 华为OD机试真题 Python 实现【去除多余空格】【2022.11 Q4 新题】
  • LeetCode 8. 字符串转换整数 (atoi)(C++)