在 MySQL 中,給數據表增加一列,是否會鎖表取決于使用的存儲引擎以及 MySQL 的版本。
InnoDB 存儲引擎在 MySQL 之前的行為
- 之前版本的 MySQL 中,如果你使用
ALTER TABLE
命令來增加一列,對于使用 InnoDB 存儲引擎的表,默認情況下會鎖表。這意味著在操作執行期間,表將被鎖定,其他讀取和寫入操作將被阻止,直到操作完成。 - 這種全表鎖定行為會導致在大型表上執行
ALTER TABLE
操作時,產生長時間的鎖等待和應用的停頓。
InnoDB 存儲引擎在 MySQL 5.6 及之后版本的改進
- 從 MySQL 5.6 開始,InnoDB 引入了在線 DDL 操作,允許一些表修改操作在不鎖定表的情況下進行。
- 具體而言,增加一列是一個在線操作,可以使用
ALGORITHM=INPLACE
來避免全表鎖定。例如:ALTER TABLE your_table ADD COLUMN new_column INT ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INPLACE
表明使用就地算法來進行修改,這是在線操作的一部分。LOCK=NONE
表示盡量不鎖表,最大程度減少對并發查詢的影響。
MySQL 8.0 及之后的版本
- MySQL 8.0 引入了一些新的特性,使得大多數的
ALTER TABLE
操作可以在不鎖定表的情況下完成,提高了在線 DDL 操作的能力。 - 在 MySQL 8.0 中默認情況下,簡單的
ALTER TABLE
操作(如增加一列)通常不會鎖定表。
具體行為的確認
要確認某個特定的 ALTER TABLE
操作是否會鎖表,可以在操作執行前使用 EXPLAIN
語句:
EXPLAIN ALTER TABLE your_table ADD COLUMN new_column INT;
該命令將顯示操作的執行計劃信息,包括是否會鎖定表。
結論
總之,在現代版的 MySQL 尤其是 MySQL 5.6 及以上版本的 InnoDB 存儲引擎中,給數據表增加一列通常不會導致全表鎖定,解決了之前版本的操作阻塞問題。然而,具體行為仍取決于實際的 MySQL 版本、存儲引擎的配置和執行的具體命令。
如果你的 MySQL 版本較舊或出于某些特殊原因不支持在線 DDL 操作,需要特別注意在非高峰期執行 ALTER TABLE
操作,以盡量減少對業務的影響。