得到消息MySQL8.0对Online Column Operations做了优化,部分Online DDL采用instant算法,使得变更时候不需要rebuild整个表,只需要在表的metadata中记录新增列额基本信息即可。在 alter 语句后增加 ALGORITHM=INSTANT 即代表使用 instant 算法,如果未明确指定,则支持 instant 算法的操作会默认使用。如果 ALGORITHM=INSTANT 指定但不支持,则操作立即失败并显示错误。
查看官方文档,得到如下信息:
接下来,我们对其中一些操作进行测试对比。
测试环境
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对字段操作引入的新的算法,对大表添加字段速度提升很大,删除字段反而速度变慢了,然而生产环境很少会删除字段,所以整体对运维同学来说,依然是个好消息。