1. 程式人生 > >MySQL之快速ALTER TABLE

MySQL之快速ALTER TABLE

對大表來說,修改它的列會導致拷貝整個表到一張新表,因此耗時較多。如用下列程式碼修改表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檔案

有些操作可能不需要重建表:

  1. 移除一個列的AUTO_INCREMENT屬性。
  2. 增加、移除或是更改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重建表的索引,通過排序來構建所有索引,包括唯一索引。

注意:以上所有方法不受官方支援,亦無文件記錄,需要自擔風險,因此執行前最好首先備份資料。