Mysql修改字段为默认空
数据库字段定义尽量不要为默认空,但是为了满足产品需求和减少开发量,所以直接将字段改为默认空。但是一样的修改SQL修改同一张表的两个Not Null字段其中一个1秒内完成;另外一个执行了1分钟都没有执行完。鉴于执行时间太慢和最近升级了数据库版本为8.0,所以中止执行,创建测试表验证SQL是否有问题。
DML
ALTER TABLE test_table_define MODIFY COLUMN type_name tinyint(1) DEFAULT NULL COMMENT 'Not Null Alter Null Test';
test_table_define:表名;type_name:字段名。
表创建结构
CREATE TABLE test_table_define (
id int(11) NOT NULL AUTO_INCREMENT,
type_name tinyint(4) DEFAULT 1 COMMENT 'Not Null Alter Null Test',
remark_ varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_general_ci,
COMMENT = '测试表定义问题';
新增两条数据
INSERT INTO test_table_define (remark_) VALUES
('测试字段默认非空,用SQL改为默认空!'),
('测试字段默认非空,用SQL改为默认空!');
执行
- Mysql版本5.7.18执行:正常,SQL.sql: DML succeeded [0.015s]
- Mysql版本8.0.23执行:正常,SQL.sql: DML succeeded [0.459s]
修改后表结构
CREATE TABLE test_table_define (
id int NOT NULL AUTO_INCREMENT,
type_name tinyint DEFAULT NULL COMMENT 'Not Null Alter Null Test',
remark_ varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8,
COLLATE utf8_general_ci,
COMMENT = '测试表定义问题';
结论
所以,DML脚本是正确,版本升级之后没有其他帖子说的增加了限制不允许Not Null改为Null。
找了一张表数据333105修改两个字段默认空,执行相同的DML脚本结果分别是:SQL.sql: DML succeeded [0.459s],SQL.sql: DML succeeded [51.836s]。所以是数据量影响了DML执行时间。
后续
MODIFY COLUMN底层做了什么事情,那么慢?
同一张表数据量都是333105,都是MODIFY,为什么一个字段只需0.4S,另一个却需要51.836S?