操作 | 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 算法使用最广泛的应该是添加列了,可以看到使用该算法还是有些限制的,一些限制如下:
说的再多不如实际来测下,下面我们以 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.0 如何快速加列的详细内容,更多关于MySQL8.0 快速加列的资料请关注脚本之家其它相关文章!