【发布时间】:2019-05-23 07:17:49
【问题描述】:
如果我在sql下面执行,mysql会锁定完整的表吗(直到下面的操作完成才能进行写入)? 我认为是的,因为它必须修改所有行并添加默认值。然而,这个操作在一个有 100 万行的表上只用了 4 秒。
ALTER TABLE `user` ADD COLUMN `col1` TINYINT(1) UNSIGNED NOT NULL DEFAULT 1;
但是,当我尝试将操作分解为 2 个单独的查询(根据我的不完全理解试图减少表锁定时间)时,第二个查询运行了 100 多秒
ALTER TABLE `user` ADD COLUMN `col1` TINYINT(1) UNSIGNED; // happens instantly
UPDATE user set col1 = true ; // takes > 100 seconds
所以我想知道为什么在最终结果相同的情况下执行时间会有如此大的差异。
【问题讨论】:
-
表是否已经有可以为空的列?
-
是的,它有可以为空的列
-
Documentation contains the answer to your question,它很长而且不那么简单,而且它依赖于存储引擎。
标签: mysql alter-table