Skip to main content

Command Palette

Search for a command to run...

千万级表数据添加字段ddl变更注意

Updated
1 min read
千万级表数据添加字段ddl变更注意
H

I am ZhangSan, a mere nobody. 我是张三,一个无名小子。

这里仅讨论 MySQL8 的情况下在线变更表结构 Online DDL

当需要给千万级数据量的数据表添加列字段时,普通默认值是不需要担心的。MySQL8 已经对新增字段有优化,支持快速加列、仅修改列名称,可以实现大表秒级加字段,会自动判断加字段时的算法 ALGORITHM=INSTANT (MySQL 8.0.12)。

当然这里会有一些限制:

  • 如果 ALTER 语句包含了 ADD COLUMN 和其他的操作,其中有操作不支持 INSTANT 算法的,那么 ALTER 语句会报错,所有的操作都不会执行

  • 只能顺序加列, 仅支持在最后添加列,而不支持在现有列的中间添加列

  • 不支持压缩表,即该表行格式不能是 COMPRESSED

  • 不支持包含全文索引的表

  • 不支持临时表

  • 不支持那些在数据字典表空间中创建的表

举例说明

如果有些需要其他语句的该如何操作呢,这里举一个特殊场景的例子:

帮一张大表添加一个 更新时间 的字段,且默认值为 当前时间,要求MySQL自动维护更新时间。原本语句如下:

-- SELECT VERSION()

ALTER TABLE `jeeinn_test` ADD COLUMN `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- ALGORITHM = INSTANT,
-- ALGORITHM = INPLACE,
LOCK = NONE;

这里即使语句中指定了某些算法,但这个语句在千万级数据量中的执行时间还是分钟级别以上且会全局锁表

这个语句的执行会进行锁表,锁表对业务是灾难性的,如果是业务频繁读写,那请在业务低低谷期执行(执行时间受限于服务器性能及数据库所在磁盘空间)。

针对于大表,我们可以利用秒级加字段的特性将上述语句进行拆分

-- 拆分语句 1 
-- 秒加字段 338ms
ALTER TABLE `jeeinn_test` ADD COLUMN `update_time` DATETIME;

-- UPDATE `jeeinn_test` SET `update_time` = CURRENT_TIMESTAMP WHERE `update_time` IS NULL;
-- 拆分语句 2
-- 二次修改字段 大数据量下执行完毕需要数百秒起步
ALTER TABLE `jeeinn_test` MODIFY COLUMN `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

拆分的优势在于利用二次修改字段的默认值,在 InnoDB 引擎下不会进行表锁定,数据仍可进行读写,业务几乎无感知。

5 views

More from this blog

git切换分支缓慢问题

背景 最近在项目中 test 分支与 master 分支切换时感到非常慢,大概需要1-2分钟 解决 找出两个分支的最大的差异 # 找出两个分支的差异 git diff --dirstat=files master..test # 输出 98.7% vendor/alipaysdk/openapi/v2/aop/request/ 分别检出两个分支到不同目录,经过比较发现文件主要差异为行尾表现不同,master 分支的文件为 LF、test 分支的为 CRLF。 处理方案 使用 .gitatt...

Feb 10, 20261 min read5

软件生产范式: 从 Ddd 到 Sdd + Tdd 的未来之路

未来的软件系统,很可能不再依赖大量手写的代码,而是依赖可验证的业务规范,以及对这些规范的自动化实现。——这正是从 DDD → SDD + TDD 的演进方向。 在 AI 深度参与软件开发的时代,传统的代码中心开发方式正在加速老化。我们正在经历一次结构性转变:从“写代码”转向“写规范 + 写测试 + 让 AI 自动补全逻辑”。 这篇文章试图提供一个前瞻性的观点(深度使用 vibe coding 近

Dec 9, 20253 min read13
软件生产范式: 从 Ddd 到 Sdd + Tdd 的未来之路

多项目部署时使用不同node版本与包管理器

nvm 项目地址:https://github.com/nvm-sh/nvmcorepack 项目地址:https://github.com/nodejs/corepack#readme 场景 前端多项目依赖不同的 nodejs 版本和不同的包管理器(npm、yarn、pnpm) 解决方案 1、依赖不同 nodejs 版本使用 nvm 来解决,项目中新增 .nvmrc 来指定版本号 2、针对不同包管理器的问题使用node自带的 corepack 来解决 # 使用指定版本 node nvm us...

Nov 5, 20251 min read1

hello1024

46 posts