MySQL增加索引會(huì)不會(huì)鎖表?這是一位許多MySQL開發(fā)者和管理員都會(huì)經(jīng)常遇到的問題。
答案是:可能會(huì),也可能不會(huì),具體情況要根據(jù)業(yè)務(wù)場景和MySQL的版本來判斷。
首先,我們需要了解MySQL的鎖機(jī)制。MySQL的鎖分為全局鎖和表級鎖,其中表級鎖又分為讀鎖和寫鎖。當(dāng)我們執(zhí)行一個(gè)ALTER TABLE操作來增加索引時(shí),MySQL會(huì)自動(dòng)獲取一個(gè)寫鎖來鎖定整張表,并阻止其他會(huì)影響該表結(jié)構(gòu)的操作。這意味著這個(gè)操作期間其他讀寫操作都不能執(zhí)行,也就是說我們需要等待ALTER TABLE操作完成之后才能繼續(xù)進(jìn)行其他操作。
示例代碼: -- 增加索引前防止其他操作干擾 LOCK TABLES `my_table` WRITE; -- 增加索引操作 ALTER TABLE `my_table` ADD INDEX `my_index`(`column_name`); -- 增加索引后釋放鎖 UNLOCK TABLES;
但是,在MySQL5.6版本之后,MySQL默認(rèn)開啟了一個(gè)新的特性——Online DDL(Online Data Definition Language),也就是說,我們可以在不鎖定表的情況下進(jìn)行DDL操作。
所以,如果你的MySQL版本是5.6或以上的版本,那么增加索引是不會(huì)鎖表的,MySQL會(huì)自動(dòng)將表復(fù)制一份,然后在復(fù)制的表上進(jìn)行索引的建立,這樣就不會(huì)阻塞原表的讀寫操作。此過程稱為元數(shù)據(jù)鎖重建(Metadata Locking Rebuild)。
綜上所述,一般情況下,MySQL增加索引時(shí)會(huì)鎖表,但是在MySQL5.6及以上版本中,可以通過Online DDL的方式避免鎖表。