做网站怎么赚钱 做网站怎么赚钱,wordpress 主题 单栏,上海市普陀区建设规划局网站,合肥制作网站的公司前言#xff1a;很早就听说 MySQL8.0 支持快速加列#xff0c;可以实现大表秒级加字段。笔者自己本地也有8.0环境#xff0c;但一直未进行测试。本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作。1.了解背景信息表结构的变更是业务运行过程中比较常见的需求之一很早就听说 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 语句后增加 ALGORITHMINSTANT 即代表使用 instant 算法 如果未明确指定则支持 instant 算法的操作会默认使用。如果 ALGORITHMINSTANT 指定但不支持则操作立即失败并显示错误。关于列的 DDL 操作是否支持 instant 等算法官方文档给出了一个表格现整理如下星号表示不是全部支持有依赖项。操作InstantIn PlaceRebuilds Table允许并发DML仅修改元数据添加列Yes*YesNo*Yes*No删除列NoYesYesYesNo重命名列NoYesNoYes*Yes更改列顺序NoYesYesYesNo设置列默认值YesYesNoYesYes更改列数据类型NoNoYesNoNo扩展VARCHAR列大小NoYesNoYesYes删除列默认值YesYesNoYesYes更改自动增量值NoYesNoYesNo*设置列为nullNoYesYes*YesNo设置列not nullNoYes*Yes*YesNo修改ENUM/SET列的定义YesYesNoYesYesinstant 算法使用最广泛的应该是添加列了可以看到使用该算法还是有些限制的一些限制如下如果 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), algorithminstant;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 创建时间, algorithminstant;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,algorithminstant;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),algorithminplace;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 -动动手指转发、在看是对我最大的鼓励