我有很多巨大的MySQL表(数以亿计的条目)。它们都有一个名为“x”的字段,需要有NOT NULL约束。其中一些已经有约束,而另一些没有。我生成了一个脚本,它为每个表修改它,不管它是否已经有约束。我的问题是,如果我执行下面的语句,并且表已经有了约束,是否会有任何性能影响?
ALTER TABLE `my_table` MODIFY COLUMN `x` datetime(3) NOT NULL;
字符串P.S.我没有直接访问这些表,所以我无法做一个测试查询,看看需要多长时间。
t30tvxxf1#
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html说:当保持相同的数据类型和[NOT] NULL属性,仅更改列名时,操作始终可以在线执行。我对此进行了测试,创建了一个表,将x定义为可空列,并填充了200万行。我试过你的ALTER TABLE:
[NOT] NULL
x
ALTER TABLE `my_table` MODIFY COLUMN `x` datetime(3) NOT NULL -------------- Query OK, 0 rows affected (2.30 sec)
字符串这表明它花了2.3秒。然后我再次运行相同的更改,在一个已经定义为NOT NULL的列上:
ALTER TABLE `my_table` MODIFY COLUMN `x` datetime(3) NOT NULL -------------- Query OK, 0 rows affected (0.01 sec)
型这要快得多,表明它能够检测到不需要改变。我可以重新测试,并在将其更改为可空和不可空之间交替。每次更改都需要几秒钟。每次不更改都不需要时间。
1条答案
按热度按时间t30tvxxf1#
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html说:
当保持相同的数据类型和
[NOT] NULL
属性,仅更改列名时,操作始终可以在线执行。我对此进行了测试,创建了一个表,将
x
定义为可空列,并填充了200万行。我试过你的ALTER TABLE:
字符串
这表明它花了2.3秒。
然后我再次运行相同的更改,在一个已经定义为NOT NULL的列上:
型
这要快得多,表明它能够检测到不需要改变。
我可以重新测试,并在将其更改为可空和不可空之间交替。每次更改都需要几秒钟。每次不更改都不需要时间。