2016-02-16 30 views

回答

22

简短回答:对于MySQL <需要5.6个锁。从5.6开始,使用InnoDB,locks are not required for many ALTER TABLE operations including adding a column


如果你使用MySQL 5.5或以上,将获得在结束整个操作读锁,然后一个简短的写锁。

From the MySQL documentation for ALTER TABLE ...

在大多数情况下,ALTER TABLE使得原始表的临时副本...虽然ALTER TABLE执行时,原始表是由其他会话(可读但很快就会有例外)。对ALTER TABLE操作开始之后开始的表进行更新和写操作将被停止,直到新表准备好为止......

前面提到的异常是ALTER TABLE块在它所在的位置读取(不只是写入)准备安装表格.frm文件的新版本,放弃旧文件,并从表格和表格定义缓存中清除过时的表格结构。此时,它必须获得排他锁。

也就是说,当添加一个列时,它会锁定大部分操作的表,然后在最后得到一个写锁。


的MySQL 5.6添加Online DDL InnoDB的这加速了,提高了许多东西,如改变表和索引。向列添加列将不再需要表锁except brief exclusive locks at the start and end of the operation

应该自动发生,但可以肯定的一套ALGORITHM=inplaceLOCK=noneALTER TABLE声明。

有一个例外...的MySQL 5.6之前创建不支持ALTER TABLE ...算法= INPLACE对于包括时间列(DATE,DATETIME或TIMESTAMP),并没有表

InnoDB表使用ALTER TABLE ... ALGORITHM = COPY重建。