0
点赞
收藏
分享

微信扫一扫

MySQL8.0新特性之快速增加列

残北 2022-08-26 阅读 72

得到消息MySQL8.0对Online Column Operations做了优化,部分Online DDL采用instant算法,使得变更时候不需要rebuild整个表,只需要在表的metadata中记录新增列额基本信息即可。在 alter 语句后增加 ALGORITHM=INSTANT 即代表使用 instant 算法,如果未明确指定,则支持 instant 算法的操作会默认使用。如果 ALGORITHM=INSTANT 指定但不支持,则操作立即失败并显示错误。
 
查看官方文档,得到如下信息:
image.png

接下来,我们对其中一些操作进行测试对比。

测试环境

MySQL5.7.32
MySQL8.0.25
测试表数据量1600万

增加列

MySQL5.7

MySQL> alter table performance_order add testcol varchar(20);
Query OK, 0 rows affected (1 min 15.47 sec)

MySQL8.0

MySQL> alter table performance_order add testcol varchar(20);
Query OK, 0 rows affected (0.02 sec)

增加列,MySQL8.0性能提升很多。

修改列名

MySQL5.7

MySQL> alter table performance_order CHANGE testcol testcol2 varchar(20);
Query OK, 0 rows affected (0.00 sec)

MySQL8.0

MySQL> alter table performance_order CHANGE testcol testcol2 varchar(20);
Query OK, 0 rows affected (0.01 sec)

修改列名,两个版执行本速度在一个级别。

设置列默认值

MySQL5.7

MySQL> alter table performance_order alter testcol2 set default '北京';
Query OK, 0 rows affected (0.00 sec)

MySQL8.0

MySQL> alter table performance_order alter testcol2 set default '北京';
Query OK, 0 rows affected (0.01 sec)

设置列默认值,两个版执行本速度在一个级别。

删除列默认值

MySQL5.7

MySQL> alter table performance_order alter testcol2 drop default;
Query OK, 0 rows affected (0.00 sec)

MySQL8.0

MySQL> alter table performance_order alter testcol2 drop default;
Query OK, 0 rows affected (0.00 sec)

删除列默认值,两个版执行本速度在一个级别。

删除列

MySQL5.7

MySQL> alter table performance_order drop column testcol2;
Query OK, 0 rows affected (1 min 19.59 sec)

MySQL8.0

MySQL> alter table performance_order drop column testcol2;
Query OK, 0 rows affected (2 min 35.51 sec)

删除列默认值,经过多次测试,MySQL8.0反而比MySQL5.7要慢一些。

总结如下:

MySQL8.0对字段操作引入的新的算法,对大表添加字段速度提升很大,删除字段反而速度变慢了,然而生产环境很少会删除字段,所以整体对运维同学来说,依然是个好消息。

举报

相关推荐

0 条评论