InnoDB表快速修改字段名方案

最近被问到一个问题,InnoDB表,只修改一个字段的名字,定义不修改,是否有快速方案。

这个需求的意义来源于,在表设计初期可以预留一些字段,但在预留字段投入使用时,最好能够赋予一个有意义的名字以方便使用。

 

复现

以下实验基于5.1.48版本。

创建一个简单表

 

CREATE TABLE `t` (

  `c1` int(11) DEFAULT NULL,

  `c2` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

 

插入10w条数据。将字段c2改名为c3.

 

mysql> alter table t change c2 c3 int(11) default null; 

Query OK, 100000 rows affected (4.29 sec)

Records: 100000  Duplicates: 0  Warnings: 0

 

可以看到,虽然只是简单修改了字段名,在实验机器上耗时达到4.2s,显然重做了所有数据。由于这个表没有索引,数据量也比较小,如果对于更大数据的表,则需要更长的操作时间。

 

分析

我们知道,在

Innodb_file_per_table参数下,每个InnoDB表有两个文件t.frm和t.ibd. 实际上,表字段信息只保存于t.frm。这个文件保存了表的定义信息,只有8k。 仅修改字段名,实际上不需要重作数据,如果能够只对t.frm做修改,则可以加快上面这个alter语句的执行速度。

 

 

 

源码相关

可以想象MySQL框架中应该是调用了InnoDB引擎的某个函数,用于判断是否需要重做数据。

我们追踪一下alter table语句的执行流程,在mysql_alter_table(sql_table.cc)函数中,我们看到这个局部变量need_copy_table,它有三个可能的取值。 

ALTER_TABLE_METADATA_ONLY= 0,

  ALTER_TABLE_DATA_CHANGED= 1,

  ALTER_TABLE_INDEX_CHANGED= 2

       显然这个取值的判断结果,决定了后面的执行流程。

mysql_alter_table中调用了compare_tables用于判断alter前后的表做了多大的改动,后者在这个语句中修改了need_copy_table的值。

 

  /* Check if changes are compatible with current handler without a copy */

  if (table->file->check_if_incompatible_data(create_info, changes))

  {

    *need_copy_table= ALTER_TABLE_DATA_CHANGED;

    DBUG_RETURN(0);

  }

 

这个check_if_incompatitble_table的函数实现在handler/ha_innodb.cc中。这个函数的返回值可能是COMPATIBLE_DATA_NO表示表改动前后不兼容(需要重做数据)或COMPATIBLE_DATA_YES兼容(不需要重做)。

该函数有如下片段

 

        if (check_column_being_renamed(table, NULL)) {

                return COMPATIBLE_DATA_NO;

        }    

 

其实现逻辑是,如果有任何一个字段名被修改,则返回COMPATIBLE_DATA_NO。

 

简单修改

    有了上述分析,要做到快速修改表字段名,只需要把调用check_column_being_renamed的这三行注释掉即可。重新编译发布后,执行结果如下。

 

mysql> alter table t change c2 c3 int(11) default null;      

Query OK, 0 rows affected (0.01 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

可以看到,这回执行基本不需要时间. 对比修改前后的t.ibd的MD5,没有修改,而t.frm中只是将c2的字段名改为c3,其他不变。

 

问题!!

这里的问题是,这个修改,是否会有副作用?虽然我们知道修改字段名应该是对数据时没有影响的,但MySQL就是这么实现了。

更深入的调查带来了“坏消息“。 在MySQL 5.1.45版本中,就没有这个字段名的判断,也就是说在5.1.45中仅修改字段名是只修改frm文件的。

 

在新版本中特别加入的判断,是否有什么原因?这是撰写本文的意图。若有与此相关的bug或者文章说明,请回复或站内私信我。

 

延伸

       实际上,关于这个问题,还可以继续深入,这里抛砖引玉。

1)      如果上述修改有副作用,副作用是什么,是否可以通过简单修改ibd文件,仍达到快速修改的目的?

2)      在例子中我们简单试验了修改字段名。对于varchar字段,alter table将字段长度增加,是否也可以按照上述思路快速修改?因为我们知道对于还没有数据的varchar字段长度改变,并不影响聚簇索引上的数据。  如果可行,对于预留varchar字段作为扩展来说,也是很有意义[实现请看下篇]。

Java开发者必看:WPS Office在线预览接入实战(含回调配置避坑指南) 本文为Java开发者提供了WPS Office在线预览功能的完整接入实战指南。详细解析了从服务申请、生成带签名的访问URL,到实现核心回调接口(文件信息、用户信息、文件保存)的全流程,并重点分享了签名算法与回调配置中的关键避坑点,帮助开发者高效集成,提升Web应用文档处理体验。 阅读详情

相关推荐

2024东南大学533复试C++程序设计笔试真题精讲

【东南553复试C++】2024东南大学533复试C++程序设计笔试真题精讲

转遍世界 3415

InnoDB表快速修改varchar字段长度方案

前一篇文章末尾提到InnoDB快速修改字段长度。其实用场景在于,在设计表时,若需要预留varchar类型字段,还无法确定实际需要的长度。而当需要启用到预留的字段时,表中可能已经有很多数据,此时要根据需要修改字段长度, 若能够不需要重做数据,则能够减少这个修改操作对线上服务的影响。   几点说明 1、  注意到这里适用的是varchar类型, char类型不在本文讨论范围内。实际上,由于var...

追风刀·丁奇 469

人形机器人人机交互解决方案(2026完整版)

《人形机器人人机交互解决方案(2026完整版)》摘要 本项目针对2026年人形机器人产业爆发式增长需求,提出了一套完整的人机交互解决方案。方案包含十大核心模块(语音识别、情感识别、手势识别等),采用五层架构设计,实现多模态融合交互,响应时间≤32ms,准确率≥99%。覆盖制造业巡检、家庭服务等10大场景,适配20+主流机型。项目总投资4.1亿元,预期年营收8.2亿元,将申请专利120项,培养专业人才300人。通过技术创新解决当前交互体验生硬、安全可控性不足等痛点,助力我国人形机器人产业实现从"跟跑

随读手记 776

mysql innodb 修改_MySQL 性能优化(INNODB下修改表结构)

最近碰到一个奇怪的问题:在MySQL中修改一个大表的结构(增加一列),发现修改缓慢无比,表是用的INNODB引擎,大小大概6G的样子!按道理修改表结构应该会很快(因为CPU耗费不是很大,无非就是读就数据写入新的文件),由于执行时间超出了预期,所以该想办法解决了(要感谢我一位无所不能的伟大的同事 )分析问题:MYSQL修改表结构时,会从旧表中读取数据,然后写入临时表(和旧表在同一目录下,命名方式为#...

weixin_28909303的博客 352

Intouch实时报警

Intouch实时报警功能的相关设置

weixin_41571357的博客 4204

【干货】SAP物料分类账的简单理解

一、SAP物料分类账理解 物料分类账,简称ML(material ledger),其基本用途是可以用八个字概括“还原成本”、“还原库存”。即通过月底运行物料分类账,将库存差异(原材料-材料成本差异、库存商品-自制半成本差异、库存商品-自制产成品差异)自动按当期库存出库数和库存结存数的比例分摊至成本和库存中。为了理解其概念,可以简单举一个例子: 开一工单,生产A产品,数量为3个,当月全部生产完工

ERP运维咨询(目标和成功) 1万+

数据库系列之InnoDB中在线DDL实现机制

DDL变更时应用版本部署过程中的常见操作,在核心业务系统中DDL操作不能保证在线完成,是会影响业务7x24小时的。MySQL 5.6开始支持在线DDL的操作,解决了执行ddl锁表的问题,保证了在进行表变更时,不会堵塞线上业务读写,保障在变更时,库依然能正常对外提供访问。本文简要介绍在线DDL的原理以及DDL原子性的实现,加深理解。

牧羊人的方向 2387

OpenClaw智能体应用第一集--飞书多智能体配置

本文介绍了智能体(Agent)的核心概念与配置实践。Agent作为独立作用域的"大脑",包含模型(认知引擎)、记忆系统(短期/长期记忆)、人设(角色定义)、工具(外部能力调用)、规划执行(任务拆解)、运行环境等核心要素。每个Agent拥有唯一agentId标识,通过accountId区分渠道账号,Binding机制实现消息路由。实践部分展示了通过命令行配置多个智能体(如writer)的过程,包括插件注册和工具加载。系统支持多Agent架构,可根据不同场景需求灵活配置专属智能体。

weixin_44626085的博客 1747

InnoDB行锁升级表锁(简单易懂)

InnoDB行锁升级到表锁的各种情况分析,彻底理解锁升级过程

PingFanXianSheng的博客 1781

ShardingJDBC支持批量插入数据

最近在进行分库分表,但是有张表,里面有一些批量的插入。 也就是: insert xxx values(...),(...),(...) 这样的语句。 开始我的依赖是: <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <v

谙忆-陈浩翔 9766

YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)

在大规模视觉预训练中,通常模型的性能受到数据、参数和FLOP三个关键因素的影响。一般来说,模型的参数数量越多,FLOP也越高,但在移动设备等对计算资源有限制的场景下,需要低FLOP的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOP,因此需要一种新的设计来解决这个问题,模块应运而生。

Limiiiing的博客 2311

[ MySql ] InnoDB存储结构

InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中。 MySql关系型数据库将记录以行格式的方式存储在磁盘上 可以在创建表或是修改表时改变当前表的行格式 CREATE TABLE(...) ROW_FORMAT...

qq_38930240的博客 654

华为OD机试真题2025双机位B卷 Java&Go 实现【朋友圈个数】

给定一组朋友关系,统计一下该朋友关系网中的朋友圈个数。 朋友圈的定义:一个朋友圈至少由3个朋友组成,且要求同一个朋友圈中的任意两个人都具有直接的朋友关系。 输入描述 输入一个朋友关系列表,如 Fiends =A.B],[A.C],IB,DI,其中的每一个元素 Friendsi表示 Friends[i][0)和 Friends [i][1] 是朋友关系 先输入一个数字 N 代表关系的总数,后面每条关系一行,两个成员以逗号分隔

MISAYAONE的博客 520

【MySQL 数据库】表的操作

本文系统讲解MySQL表的基础操作,包括创建、查看、修改和删除表。首先介绍创建表的语法,需指定字段名、数据类型等,不同存储引擎生成不同文件。通过DESC命令可查看表结构。重点讲解ALTERTABLE的5种操作:添加/修改/删除字段、重命名表和字段。最后说明DROPTABLE的删除操作及注意事项,强调数据不可恢复性。文章提供完整操作流程示例,并总结MySQL表操作四大核心命令,帮助开发者掌握90%的表结构管理需求,特别提醒ALTER操作需谨慎执行。

wuqingyigexiaoba的博客 1431

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【MySQL数据库基础】(四)MySQL 表的操作通关指南:创建 / 修改 / 删除一网打尽

本文全面讲解了MySQL数据表的操作指南,涵盖创建、查看、修改和删除表的核心语法及实战技巧。重点包括:1)创建表时如何选择字段类型、字符集和存储引擎(InnoDB/MyISAM);2)使用DESC命令查看表结构;3)修改表的高频场景(添加/修改/删除字段、重命名);4)删除表的高危操作注意事项。文章特别强调规范操作的重要性,如字段注释、非空设置、操作前备份等最佳实践,帮助开发者避免数据丢失风险。通过本文,读者可以系统掌握MySQL表操作的全套技能,从基础语法到实战避坑指南。

2301_79248256的博客 1510

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

表锁问题全解析,深度解读MySQL表锁问题及解决方案

深入解析MySQL表锁问题根源与解决方案,涵盖常见场景、锁类型对比及优化策略。结合Java程序员节祝福语,致敬奋战在一线的技术人。提升系统性能的实用指南,值得收藏。

LearnFlow的博客 560

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

php 表添加字段sql语句怎么写,Mysql学习MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结...

《Mysql学习MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结》要点:本文介绍了Mysql学习MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结,希望对您有用。如果有疑问,可以联系我们。MYSQL必读本文实例讲述了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法.分享给大家供大家参考,具体如下:MYSQL必读建表:MYSQL必读DROP TA...

weixin_33016287的博客 182

MYSQL【表操作】

1)创建表时需定义字段名、数据类型、字符集、校验规则和存储引擎,不同引擎生成的文件结构不同;2)使用DESC命令查看表结构;3)通过ALTER TABLE实现字段增删改、表重命名等操作,强调修改字段类型和删除字段的风险;4)DROP TABLE删除表的方法及安全删除建议。

原来是猿的成长足迹 362

自用:mysql表

一: 存储引擎介绍 二: 表介绍 三:创建表 四:查看表结构 五:数据类型 六:表完整性约束 七:修改表 八:复制表 九:删除表 ······································ 一:存储引擎介绍 存储引擎说白了就是如何存储数据,如何为存储的数据机那里索引和如何更新,查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以成为表类型(存储和操作此表的类型) sql 解释器,sql优化器,缓冲池,存储引擎等组件在每个数据库中都存在,但不是每个数据

暮暮苒也的博客 146

【数据库】MySQL 表的操作

表的创建 create table [if not exists] `表的名字` ( id int not null auto_increment primary key comment '主 键', account char(255) comment '⽤⼾名' default 'admin', pwd varchar(65535) comment '密码' not null ) en...

weixin_44727383的博客 106

MySQL关于表的操作

本文介绍了MySQL数据库表的基本操作。主要内容包括:1)创建表的语法和示例,说明字段定义、字符集、校验规则和存储引擎选项;2)查看表结构的desc命令;3)修改表的常用操作,如添加/修改/删除字段、修改表名等ALTER TABLE语句;4)删除表的DROP TABLE语法。文章还对比了MyISAM和InnoDB存储引擎在文件存储上的区别,并提供了完整的表操作命令总结。这些基础操作是数据库管理的重要技能,适用于项目开发中的表结构调整需求。

FirstForst的博客 298

MySQL修改表结构(五)

我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。

两个蝴蝶飞 2501

3. 表相关的操作

3. 表相关的操作 1. 存储引擎介绍 1.1. 什么是存储引擎 mysql中建立的库===》文件夹 库中建立的表===》文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该又不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎说白了就是如何存储数据,如何存储的数据建立索引和如何更新,查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存

weixin_43984157的博客 369

MySQL:表的约束+设置表的字段值自动增加

MySQL:表的约束+设置表的字段值自动增加

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 88万+

MySQL InnoDB 结构和索引

MySQL数据库,InnoDB5.7学习记录:一. 部分参数的查询 -- 非正式交互超时时间 如JDBC show global variables like 'wait_timeout' ; -- 交互式超时时间 show global variables like 'interactive_timeout' ; -- 当前数据库连接状态 show global status like 'Thread%'; -- 最大连接数 show global variables like 'max_conne

weixin_41564440的博客 254

二、InnoDB的页

InnoDB操作的基本单位是页,大小一般是16KB。也分诸多类型,我们最常接触的类型就是数据页(INDEX类型)。比如还有存放表空间信息的信息页,日志页。。。。。 一、页的结构 页的通用结构 字段名 中文名 长度 简单描述 作用 File Header 文件头部 38B 页的通用信息 起码能表明本页是属于哪个表空间的 Page Head...

吃一口瓜 的博客 433
上一篇: MySQL中NULL字段的比较问题
下一篇: InnoDB表快速修改varchar字段长度方案
iteye_621
博客等级 码龄8年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值