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

补充MySQL官网知识--解锁Online VARCHAR字段扩展与Index的关系

大家可以先看本文的结论【即 4. 总结】,如有兴趣再顺读。

1. Online DDL Support for Column Operations

OperationIn PlaceRebuilds TablePermits Concurrent DMLOnly Modifies Metadata
Adding a column Yes Yes Yes* No
Dropping a column Yes Yes Yes No
Renaming a column Yes No Yes* Yes
Reordering columns Yes Yes Yes No
Setting a column default value Yes No Yes Yes
Changing the column data type No Yes No No
Extending VARCHAR column size Yes No Yes Yes
Dropping the column default value Yes No Yes Yes
Changing the auto-increment value Yes No Yes No*
Making a column NULL Yes Yes* Yes No
Making a column NOT NULL Yes* Yes* Yes No
Modifying the definition of an ENUM or SET column Yes No Yes Yes

2. Extending VARCHAR column size

OperationIn PlaceRebuilds TablePermits Concurrent DMLOnly Modifies Metadata
Extending VARCHAR column size Yes No Yes Yes

修改的语法如下

ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;

The number of length bytes required by a VARCHAR column must remain the same. For VARCHAR columns of 0 to 255 bytes in size, one length byte is required to encode the value. For VARCHAR columns of 256 bytes in size or more, two length bytes are required. As a result, in-place ALTER TABLE only supports increasing VARCHAR column size from 0 to 255 bytes, or from 256 bytes to a greater size. In-place ALTER TABLE does not support increasing the size of a VARCHAR column from less than 256 bytes to a size equal to or greater than 256 bytes. In this case, the number of required length bytes changes from 1 to 2, which is only supported by a table copy (ALGORITHM=COPY). For example, attempting to change VARCHAR column size for a single byte character set from VARCHAR(255) to VARCHAR(256) using in-place ALTER TABLE returns this error:

ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
column type INPLACE. Try ALGORITHM=COPY.

注意:The byte length of a VARCHAR column is dependant on the byte length of the character set.

Decreasing VARCHAR size using in-place ALTER TABLE is not supported. Decreasing VARCHAR size requires a table copy (ALGORITHM=COPY).

---摘自官网:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html#online-ddl-column-operations

 

注意:在有关Extending VARCHAR column size的说明中 ,官网没有涉及字段Index的内容。很可惜。

3. 不一样的风景

3.1 场景

不知读者是否已遇到或者注意到,给表的字段扩展长度有时候很快,而有时候有需要消耗几分钟。排除掉官网提到的字段长度encode临界值的修改---字节256,还是解释不了为什么会执行那么久。

按照官网的说明,在相同的encode字节要求下(1--255;256及以上),  这个操作只是修改了元数据,不需要Rebuilds Table,应该瞬间完成(或者说3S内)。那么执行了几分钟,是不是很有些因素是官网没有提到的。

3.2 举例说明

MySQL版本 5.7.21
Server配置 8核24G;VSAN盘
表--qq_order_cust

记录数:760W

Data length:2.8G

Index length:1.5G

Table Size:4.3G 

修改的列

列1:product_name VARCHAR(64)

列1:per_type VARCHAR(16)

table collation utf8mb4_general_ci

 

SQL语句1

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN product_name product_name VARCHAR(128);

product_name列的长度由64调整到128,  这条语句执行了247S,4分钟。--这个情况是用官网知识解释不了的,不符合预期。

SQL语句2

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN per_type per_type VARCHAR(32);

per_type列的长度由16调整到32,这条语句 瞬间完成,不到1S。---符合预期

有同学可能会认为会不会数据已缓存到内存中了,所以SQL语句2执行快了很多。这个我们排除掉了。--我们执行了语句3--将product_name 由128调整到132--,还是执行240多秒,所以,语句2执行快很快和数据内存无关。

按照官网的知识,上面两个语句都是应该瞬间执行完成的。

这是怎么回事?难道是随机的?这以后怎么评估执行时间和影响呢?

3.3 灵光乍现

反复比较,盯着表创建语句看了N遍,忽然发现 耗时久的那个字段上有index,是两个独立的索引Index,即这个字段和其它不同的字段分别组合了Composite Index。

难道耗时久,和index有关。

抱着尝试的心态,我们决定试下。

因为是验证环境,保存语句,然后,我们直接将这两个有关 product_name 的index直接删除掉了。

再执行 SQL4 

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN product_name product_name VARCHAR(132);

长度由128调整到132,这次瞬间完成了,不到1S。---符合预期

惊喜,那就再验证一次

SQL5

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN product_name product_name VARCHAR(156);

这是还是瞬间完成。---符合预期

基于以上的验证,可以得出以下结论

结论: 修改有索引的字段的长度,不会瞬间完成,不是Only Modifies Metadata 。这是官网上没提到的。

3.4 继续探究

实验尚未。刚才说了,在两个关联索引的条件下耗时247S,如果只有一个关联index,不会快些。【注意:所谓的关联index,是指和指定字段有关联,和要修改的字段有关联】

我们想到这一点,已经欣欣然了,忍不住继续测试下去。

先仅修复其中一个index。在此条件下执行SQL6

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN product_name product_name VARCHAR(186);

SQL耗时变成了131S。耗时是原来的一半左右。------符合预期,小小激动。

继续修复第二个关联index,执行SQL7

ALTER TABLE qq_order_cust ALGORITHM=INPLACE, CHANGE COLUMN product_name product_name VARCHAR(258);

此时,SQL耗时变成了242S。

基于以上的验证,可以得出以下结论

结论:修改有索引的字段的长度,其耗时 和 这个字段上索引的个数正相关;索引越多,耗时越久。这是官网上没提到的。

4. 总结

1. Extending VARCHAR column size,字段的字节长度(255-->256)是个临界值。注意是字节,如果选用的字符集是utf8mb4,VARCHAR字段对应的VARCHAR(63)-->VARCHAR(64)是临界值。这点官网上有提到。

2.修改有索引的字段的长度,不会瞬间完成,不是Only Modifies Metadata。这是官网上没提到的。

3.修改有索引的字段的长度,其耗时 和 这个字段上索引的个数正相关;索引越多,耗时越久。这是官网上没提到的。

4. 官网中 字段长度扩展不Rebuilds Table、Only Modifies Metadata,这儿应该有个特指--仅指的是聚簇索引(Clustered Index),不包含辅助index(也被称为二级索引非聚簇索引)。因为案例中的4分钟,应该是在重整字段相关的辅助ndex,通过监控也可以看到4分钟内有大量的IO操作。这是官网上没提到的。

 

备注

1.此测试是在MySQL 5.7.21 版本下验证的,MySQL8.0 版本下是什么表现,尚未验证。

2.本次字段扩展实验用的是utf8mb4字符集下VARCHAR类型。

 

http://www.jsqmd.com/news/983992/

相关文章:

  • 当阴阳师遇上AI助手:你的24小时御魂刷本管家
  • TileMapDual六边形网格完全指南:打造精美蜂窝地图的10个步骤
  • 3PEAK思瑞浦 TPA5521-S5TR SOT23-5 运算放大器
  • 如何用Kodi IPTV Simple Client轻松搭建家庭直播电视系统
  • 阿里7w字 置身事外 读后感
  • 华硕笔记本性能调节终极指南:5分钟掌握G-Helper轻量级控制神器
  • 面向对象的三大特性
  • CouchApp与CouchDB集成:如何创建高效的数据驱动Web应用的7个步骤
  • 实测12款论文降AIGC网站,效果最好的竟然是它!
  • 昇腾CANN共享内存通信库shmem深度实践:多进程场景下的零拷贝数据共享
  • AIRECOMANDATIONWEBSYS 项目组
  • Maestro AI功能深度解析:智能UI缺陷检测与文本提取技术实现
  • 从‘多普勒效应’到‘载波同步’:一个故事讲清无线通信中的频率偏移
  • 如何免费解锁Wand专业版:3步实现完整游戏修改体验
  • 终极暗黑2存档编辑器:免费网页工具让D2/D2R存档编辑变得简单快速
  • 3PEAK思瑞浦 TPA5522-SO1R SOP8 运算放大器
  • 2026天津空调拆装公司实惠榜:五家性价比王者深度解析,高效拆装与透明收费的终极对决 - 品牌发掘
  • C++动态内存管理 模板
  • GGUF+Ollama本地部署大模型:原理、选型与实战指南
  • ёRadio VU表实现原理:音频可视化效果的秘密
  • py之socket ssl双向认证代码(亲测好用)
  • GDM Settings 主题定制指南:如何更换GNOME登录界面的背景、图标和光标主题
  • 2026上海屋顶绿化十大实力服务商:五家本土品牌以生态设计与智能灌溉领跑行业深度解析 - 品牌发掘
  • 零成本AI投资分析:3步掌握智能选股系统,让小白也能获得机构级洞察
  • 3步掌握TTS-Vue:微软语音合成桌面工具零基础配置指南
  • LLMxMapReduce未来展望:多模态支持、实时处理与分布式计算的演进方向
  • 神经渲染:打开宇宙的“数字之眼”——天文可视化的新范式
  • 工厂用吸尘器排行榜2025实测:史沃斯凭什么稳居第一? - 工业清洁测评社
  • FGO-py:让你的Fate/Grand Order游戏体验焕然一新的智能管家
  • Mac文件预览革命:50+款QuickLook插件如何彻底改变你的工作效率