MySQL执行无变更的列修改语句是否会产生性能损耗?
问题
我拥有多张超大规模的MySQL表(数亿条记录),这些表均包含字段x,需要为该字段添加NOT NULL约束。其中部分表已存在该约束,部分则没有。我生成了一个对所有表执行修改的脚本,无论表是否已存在该约束。我的问题是:当表已具备该约束时,执行语句ALTER TABLE my_tableMODIFY COLUMNx datetime(3) NOT NULL;是否会产生任何性能损耗?另外,我无法直接访问这些表,因此无法进行测试查询来查看耗时。
回答
- MySQL 8.0及以上版本:
当目标字段已经存在NOT NULL约束,且字段类型(包括datetime(3)的精度)和语句中指定的完全一致时,执行这条ALTER TABLE语句几乎没有性能损耗。MySQL 8.0会先校验表的现有结构,发现修改请求与当前结构完全匹配后,会直接跳过表重建操作,仅更新数据字典中的元信息,这个过程是瞬时完成的,对亿级数据量的大表几乎无影响。 - MySQL 5.7及更早版本:
这类版本的Online DDL支持能力有限,即便字段已经符合约束要求,执行这条语句仍可能触发全表重建(取决于表引擎和具体配置,比如InnoDB)。数亿条记录的表重建会占用大量CPU、IO资源,锁表时间较长,会对业务造成严重影响。 - 额外提醒:
即使在MySQL 8.0版本中,也要确认现有字段的类型细节是否完全匹配。比如如果现有字段是不带精度的datetime,即便有NOT NULL约束,执行这条指定datetime(3)的语句仍会触发表结构变更,产生明显的性能损耗。
内容的提问来源于stack exchange,提问作者Abvgz
相关产品推荐
相关产品推荐

