前言:

很早就听说 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 了呢,可以着手准确起来了。

推荐阅读

(点击标题可跳转阅读)

MySQL参数是啥,你知道吗?

MySQL redo与undo日志解析

MySQL中的这几类日志,你一定要知道

- End -动动手指转发、在看是对我最大的鼓励

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. mysql 吧库下的表名都加_MySQL 数据库名、表名、字段名大小写敏感记录

    问题如下: 比如上图中的PERSON表,查询SQL语句中如果表名是小写,就会报错说person表不存在. 因为Linux环境下的MySQL数据库的表名默认是区分大小写的,可以查看Linux上的MySQ ...

  9. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

最新文章

  1. jqGrid使用整理
  2. 项目--------------使用BiLSTMCRF将病例文本中的诊断数据识别出来
  3. sqlserver 创建对某个存储过程执行情况的跟踪
  4. 洛谷省选斗兽场全通关祭~以及之后的打算!
  5. Java8新特性之Lambda表达式
  6. 人在职场,身不由己?
  7. Android之Dex动态加载机制解析
  8. 自定义jsx解析工厂函数
  9. matlab在三维人体及服装建模上的应用,Matlab在三维人体及服装建模上的应用
  10. python登录系统账号检测_使用Python脚本检测邮件账户密码是否被泄漏,提高你的账户安全性...
  11. Ruby+Selenium demo
  12. Matlab:License checkout failed. License Manager Error-95解决办法与Matlab加速启动
  13. 量化选股策略搭建(一)(股票数据获取)
  14. 微软speeh sdk5.1安装及简单的读取文字
  15. windows中bat脚本编写
  16. 【码农教程】手把手教你Mockito的使用
  17. 认识System,System32,Syswow64
  18. 总结 所有的git错误 持续更新--------
  19. 7-12 h0004.双倍
  20. IE6.0.2800.1106 和 IE6.0.2800.1106

热门文章

  1. 前端学习(1809):前端调试之微博头部开发
  2. 前端学习(1312):响应报文
  3. java面试题27 java中下面哪些是Object类的方法()
  4. 第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧
  5. 安装kickstart失败
  6. dockfile应用(二)
  7. 计算机专业英语的题目,计算机专业英语题目
  8. php json传输被过滤,php-the_content过滤器,用于将自定义字段添加到JSON响应
  9. 第四届cccc团体程序设计天梯赛
  10. v-contextmenu的使用(右键菜单)