MySQL 给数据表增加一列,一定会锁表吗?

让我告诉你一些发生在我身上的事情。
前年,我帮一个朋友搭建了一个系统。
他有 MySQL 5 .6 ,表非常大,有几百 MB。
那天晚上,他坚持要添加一个非空白栏。
我说好,做完就去睡觉了。
结果他半夜给我打电话说系统崩溃了。
当我检查时,哦,整个时钟都停了。
查资料后发现,5 .6 虽然支持在线DDL,但并不是在所有情况下都可以工作。
特别是如果添加不可为空的列,则必须另外处理默认值,这会使事情变得复杂并且更容易锁定表。

后来大概是后天,接到一个新项目,直接用MySQL 8 .0。
当它添加我时,我还在担心是否再次锁定我的手表。
结果?什么也没发生,几秒钟之内就完成了更改,对业务没有影响。
这是由于 8 .0 的一组优化、原子 DDL 和元数据更新速度更快。
想一想,以前添加一列需要等待整个表数据处理完毕,但现在我们只需要改变内存中的东西,不需要锁。

不过话说回来,我踩的坑还有一个问题。
前年,我帮家乡的一家工厂修改了系统。
他们的MySQL还是5 .5 ,表很大,有G那么大。
那天我们要加索引列,所以我提前告诉他们,机器要宕机一段时间。
可能会关闭。
结果我改的时候,桌子还是关着的,而且关着很长一段时间。
这证明,无论你的表有多大,无论操作多么复杂,无论版本有多大,表被锁定的机会都很高。
凡是你能想到的,都不能一概而论。

所以,我建议你使用较新的版本没有什么问题,8 .0是最好的。
如果无法使用,则需要更换手表。
首先,检查一下手表有多大以及它的运作方式。
对于小表,只需添加一个可为空的列,可能不需要锁。
但是,如果您的表非常大,并且必须添加带有索引等的非空列,则应该备份数据并在没有人使用时进行更改。
进行更改后,立即监视其他位置是否被锁定。
好吧,我真的不能轻易的,不然我会哭的。

对线面试官:MySQL 给数据表增加一列,一定会锁表吗?