對(duì)于MySQL DBA來說,加字段是一項(xiàng)常見任務(wù)。在添加字段的過程中,我們經(jīng)常會(huì)遇到一個(gè)問題:是否會(huì)鎖表?
加字段是否會(huì)鎖表,取決于我們是如何添加字段的。如果使用ALTER TABLE語句添加字段,這個(gè)過程會(huì)鎖表,由于ALTER TABLE操作導(dǎo)致整個(gè)表變?yōu)椤皌able locking”模型,此時(shí)所有的更新、刪除、插入操作都會(huì)被阻塞,只有添加字段操作被允許。如果數(shù)據(jù)量大或表格被訪問頻繁,用戶可能會(huì)經(jīng)歷數(shù)秒或數(shù)分鐘的服務(wù)不可用狀態(tài)。
ALTER TABLE table_name ADD COLUMN column_name datatype;
如果表格非常大,數(shù)據(jù)量在數(shù)千萬到數(shù)十億行之間,鎖表時(shí)間會(huì)變得很長(zhǎng)。在生產(chǎn)環(huán)境中執(zhí)行這個(gè)操作時(shí),要特別謹(jǐn)慎。大型列的增加也不例外。
不過,MySQL 5.6之后已引入另一種添加字段的方法,即在線DDL(add column)操作。使用該方法時(shí),MySQL允許每次執(zhí)行1.2秒以內(nèi)的操作來增加一個(gè)新列,而不會(huì)鎖定整個(gè)表。在線DDL的原理是,在不鎖定表的情況下,在寫入新列的同時(shí)更新元數(shù)據(jù)。
ALTER TABLE table_name ADD COLUMN column_name datatype ONLINE;
在此操作中,添加字段所需的時(shí)間明顯比鎖表模型更短,因此對(duì)許多業(yè)務(wù)請(qǐng)求的響應(yīng)速度不會(huì)產(chǎn)生影響。但是,需要注意的是,在線DDL的操作可能會(huì)增加其他資源消耗(例如CPU、磁盤I/O),以便在不影響表的情況下更新元數(shù)據(jù)。
縱觀全文,MySQL添加字段是否會(huì)鎖表,取決于數(shù)據(jù)量大小、表的訪問頻率和所選擇的添加字段方法。有了上述的方法,在添加字段的時(shí)候就能夠充分地評(píng)估所需時(shí)間,大幅提高M(jìn)ySQL的穩(wěn)定性。