假设我的mysql数据库中有3亿用户(innodb
)。其中一些设置为username
,而其中一些设置为“用户名为空”,并且假设其中60%不为空(具有实际的varchar值)。
如果我想设置所有3亿用户'用户名为null,将
UPDATE users SET username = null WHERE username IS NOT NULL
表现优于
UPDATE users SET username = null
- 没有WHERE子句,只需将它们全部置空?
我知道在设置实际值时,WHERE总是表现得更快,但不知何故,空字段让我想到了这一点。
答案 0 :(得分:1)
两者都会花费很长时间。我建议你按照我在博客中描述的“块”进行操作: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
这是另一种解决方案:
ALTER TABLE t DROP COLUMN c;
ALTER TABLE t ADD COLUMN c VARCHAR(...) DEFAULT NULL;
每个ALTER
会将表复制一次而不用写入ROLLBACK日志(等),从而显着加快速度。 (我怀疑你是否可以将两者结合成一个陈述。)
但首先,让我们回过头来讨论为什么你需要做这个不寻常的任务。这很可能表明架构设计不佳。重新思考设计可能是一种更好的方法。