MySQL之快速ALTER TABLE
阿新 • • 發佈:2018-12-12
對大表來說,修改它的列會導致拷貝整個表到一張新表,因此耗時較多。如用下列程式碼修改表file,將其預設值由2修改為5。通過SHOW STATUS顯示做了1000次讀操作和1000插入操作。即拷貝了整張表到一張新表。
ALTER TABLE user.file
MODIFY COLUMN number TINYINT(3) NOT NULL DEFAULT 5;
解決之道:僅修改表的.frm檔案而不涉及表資料。 如:
ALTER TABLE user.file
ALTER COLUMN number SET DEFAULT 5;
修改.frm檔案
有些操作可能不需要重建表:
- 移除一個列的AUTO_INCREMENT屬性。
- 增加、移除或是更改ENUM和SET常量,如果移除的是已有行資料用到其值的常量,查詢會返回一個空字串。
如何修改.frm檔案,關鍵在於建立一個新的.frm檔案,用其代替原表的.frm檔案。具體步驟如下:
- 建立相同結構的空表,並進行必要的修改。
- 執行FLUSH TABLES WITH READ LOCK。關閉所有正在使用的表,並禁止開啟。
- 替換.frm檔案
- 執行UNLOCK TABLES,釋放步驟2的讀鎖。
快速建立MyISAM索引
將資料高速地載入MyISAM表中,技巧是先禁用索引,載入資料,然後重新啟用索引,如下所示。
ALTER TABLE user.file DISABLE KEYS; ---load data ALTER TABLE user.file ENABLE KEYS;
這個方法對非唯一索引有效,但對唯一索引無效。可行方法如下。
- 建立一個所需結構的表,但無索引。
- 載入資料到表中,構建.MYD(MyISAM資料)檔案。
- 按照所需結構另外建立一個空表,包含索引,由此構建.frm檔案(MyISAM資料結構)和.MYI(MyISAM索引)檔案。
- 獲取讀鎖並重新整理表
- 重新命名第二張表的.frm和.MYI檔案,方法如修改.frm檔案,讓MySQL認為是第一張表的檔案。
- 釋放讀鎖
- 使用REPAIR TABLE重建表的索引,通過排序來構建所有索引,包括唯一索引。
注意:以上所有方法不受官方支援,亦無文件記錄,需要自擔風險,因此執行前最好首先備份資料。