前言:?

很早就听说 MySQL8.0 支持快速加列,可以实现大表秒级加字段。笔者自己本地也有8.0环境,但一直未进行测试。本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作。

1.了解背景信息

表结构的变更是业务运行过程中比较常见的需求之一,在 MySQL 的环境中,可以使用 Alter 语句来完成这些操作,这些 Alter 语句对应的操作通常也称之为 DDL 操作。通常情况下大表的 DDL 操作都会对业务有很明显的影响,需要在业务空闲,或者是维护的时候做。MySQL 5.7 支持 Online DDL,大部分 DDL 不影响对表的读取和写入,但是依然会消耗非常多的时间,且占用额外的磁盘空间,并会造成主从延迟。所以大表 DDL 仍是一件令 DBA 头痛的事。

听闻 MySQL 8.0 解决了这件令 DBA 头痛的事,那让我们来详细了解下吧。想了解新功能,最简单的方法就是查阅官方文档。查阅官方文档得知,快速加列即 Instant Add Column?,该功能自 MySQL 8.0.12 版本引入,是由腾讯游戏DBA团队贡献。注意一下,此功能只适用于 InnoDB 表。

2.快速加列测试

快速加列采用的是?instant 算法,使得添加列时不再需要 rebuild 整个表,只需要在表的 metadata 中记录新增列的基本信息即可。在 alter 语句后增加 ALGORITHM=INSTANT?即代表使用?instant 算法,?如果未明确指定,则支持?instant 算法的操作会默认使用。如果 ALGORITHM=INSTANT 指定但不支持,则操作立即失败并显示错误。

关于列的 DDL 操作,是否支持?instant 等算法,官方文档给出了一个表格,现整理如下,星号表示不是全部支持,有依赖项。

操作

Instant

In Place

Rebuilds Table

允许并发DML

仅修改元数据

添加列

Yes*

Yes

No*

Yes*

No

删除列

No

Yes

Yes

Yes

No

重命名列

No

Yes

No

Yes*

Yes

更改列顺序

No

Yes

Yes

Yes

No

设置列默认值

Yes

Yes

No

Yes

Yes

更改列数据类型

No

No

Yes

No

No

扩展VARCHAR列大小

No

Yes

No

Yes

Yes

删除列默认值

Yes

Yes

No

Yes

Yes

更改自动增量值

No

Yes

No

Yes

No*

设置列为null

No

Yes

Yes*

Yes

No

设置列not null

No

Yes*

Yes*

Yes

No

修改ENUM/SET列的定义

Yes

Yes

No

Yes

Yes

?

instant 算法使用最广泛的应该是添加列了,可以看到使用该算法还是有些限制的,一些限制如下:

如果 alter 语句包含了 add column 和其他的操作,其中有操作不支持 instant 算法的,那么 alter 语句会报错,所有的操作都不会执行。

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

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

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

不支持临时表。

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

说的再多不如实际来测下,下面我们以 8.0.19 版本为例来实际验证下:

# 利用sysbench生成一张1000W的大表

mysql> select version();

+-----------+

| version() |

+-----------+

| 8.0.19 |

+-----------+

1 row in set (0.00 sec)

mysql> select count(*) from sbtest1;

+----------+

| count(*) |

+----------+

| 10000000 |

+----------+

# 增加无默认值的列

mysql> alter table sbtest1 add column col1 varchar(20), algorithm=instant;

Query OK, 0 rows affected (0.63 sec)

Records: 0 Duplicates: 0 Warnings: 0

# 增加有默认值的列

mysql> alter table sbtest1 add column create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘, algorithm=instant;

Query OK, 0 rows affected (0.58 sec)

Records: 0 Duplicates: 0 Warnings: 0

# 不显式指定instant算法

mysql> alter table sbtest1 add column col2 varchar(20);

Query OK, 0 rows affected (0.55 sec)

Records: 0 Duplicates: 0 Warnings: 0

# 设置列的默认值

mysql> alter table sbtest1 alter column col1 set default ‘sql‘,algorithm=instant;

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0 Warnings: 0

# 指定In Place算法添加列,(5.7版本添加列使用该算法)

mysql> alter table sbtest1 add column col_inplace varchar(20),algorithm=inplace;

Query OK, 0 rows affected (1 min 23.30 sec)

Records: 0 Duplicates: 0 Warnings: 0

通过以上测试,我们可以发现,使用 instant 算法添加列基本都在 1s 内完成,对于大表来说这个速度是非常快的,业务基本无感知。当使用 5.7 版本的 inplace 算法时,则添加列的时间上升至数分钟。对比看来 8.0 版本的快速加列功能确实非常实用!

总结:?

虽然快速加列存在一些限制, instant 算法也只适用于部分 DDL 操作,但 8.0 的这项新功能已经足以令人兴奋,很大程度上解决了大表加字段的大难题。通过这篇文章,希望各位能了解到这项新功能,是不是想升级到 8.0 了呢,可以着手准确起来了。

Mysql8秒级加字段_MySQL8.0大表秒加字段,是真的吗?相关推荐

  1. mysql 加字段_MySQL8.0大表秒加字段,是真的吗?

    前言: 很早就听说 MySQL8.0 支持快速加列,可以实现大表秒级加字段.笔者自己本地也有8.0环境,但一直未进行测试.本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作. 1.了解 ...

  2. 插入最快mysql8.0_MySQL8.0大表秒加字段,是真的吗?

    前言: 很早就听说 MySQL8.0 支持快速加列,可以实现大表秒级加字段.笔者自己本地也有8.0环境,但一直未进行测试.本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作. 1.了解 ...

  3. 给一个大表增加一个字段,带默认值

    转载自:http://www.itpub.net/forum.php?mod=viewthread&tid=1083259&highlight= 给一个大表增加一个字段,给怎样操作. ...

  4. mysql高效查出重复的手机号_Mysql必读MySQL大表中重复字段的高效率查询方法

    <MysqL必读MysqL大表中重复字段的高效率查询方法>要点: 本文介绍了MysqL必读MysqL大表中重复字段的高效率查询方法,希望对您有用.如果有疑问,可以联系我们.MysqL大表重 ...

  5. 修改字段类型 Alter table 表名 modify 字段名 字段类型mysql数据库概念及入门语句...

    1.数据库的概念 数据库(DataBase,DB)是一个长期存储在计算机内的.有组织的.有共享的.统一管理的数据集合.她是一个按数据结构来存储和管理数据的计算机软件系统.数据库的概念实际包括两层意思: ...

  6. Mysql8秒级加字段_Mysql8.0秒级加字段

    Mysql 8.0版本合并了腾讯互娱数据库团队的Patch,可以实现秒级添加字段,这个功能可谓是mysql数据库攻城狮的福音,解决了之前5.6,5.7版本添加字段很高的运维成本. 下面是验证mysql ...

  7. 秒级处理海量数据,浙江移动大数据平台是怎么做到的?

    近年来,随着云计算.移动互联网.物联网等技术的发展,以及智能手机.平板电脑等终端设备的不断涌现,各种类型的电商.社交媒体等应用快速发展,产生了海量的数据,并且数据量增长的速度越来越快,庞大的数据资源引 ...

  8. 秒级处理海量数据,浙江移动大数据平台是怎么做到的

    项目背景 近年来,随着云计算.移动互联网.物联网等技术的发展,以及智能手机.平板电脑等终端设备的不断涌现,各种类型的电商.社交媒体等应用快速发展,产生了海量的数据,并且数据量增长的速度越来越快,庞大的 ...

  9. Mysql给一个大表加一列_MySQL 大表添加一列的实现

    问题参考自: https://www.zhihu.com/question/440231149 ,mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改 ...

最新文章

  1. 谈谈阿里所谓的“要性”
  2. java或异运算_JAVA 或与非运算符 与()、或(|)、异或(^)【组图】
  3. 再见收费的Navicat!操作所有数据库靠它就够了!
  4. 失败的人生图片_人到中年,做事失败了,很可能是遇到了以下五种情况
  5. Python入门--字符串的切片操作
  6. Windows 8 Metro中文件的操作及访问(读写删除复制)
  7. leetcode—16.两数相加链表python解答
  8. 游戏筑基开开发之指针数组及数组指针详解(C语言)
  9. maven pom 文件的 scope,scope=system 时打包打不进
  10. Win7安装驱动提示“无法验驱动程序数字签名”怎么办?
  11. WPS表格(Excel)常用函数与技巧总结
  12. Flash 0day漏洞(CVE-2018-5002)千万不要乱打开Excel文档!
  13. 视频播放过程中做视频问答(视频弹题功能)
  14. 多穿立体库系统四向车PLC流程控制
  15. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info
  16. QList(增删改查)示例
  17. 华为交换机运行过多设备会导致内存不足解决方法
  18. 应用软件新建工程可研报告-目录范例
  19. 【荐读】我观察14年才发现,那些很努力却没成就的人都有一个特点
  20. Safari下载东西太慢怎么办?

热门文章

  1. RAC环境下的备份与恢复(五)
  2. 关于 WebRequest.RegisterPrefix
  3. SoundPool的sample 1 not READY问题
  4. Q111:PBRT-V3系统概述
  5. 数据分析的数据来源于哪
  6. 数据分析工具该如何选择
  7. 服务器间数据传输的四种方式
  8. 2021年高考呼和浩特市二中成绩查询,呼和浩特市第二中学,是一所百强中学,2020年高考用实力来证明!...
  9. python换行符号长度_创建带换行符的可调整大小/多行Tkinter/ttk标签
  10. 牛客编程巅峰赛S2第6场 - 钻石王者