MySQL之 加快ALTER TABLE的執行速度


本節內容總結自《High Performance MySQL》

加快ALTER TABLE的操作速度

MySQL執行ALTER TABLE的原理
  • MySQL執行大部分修改表結構操作的方法是用一個新的結構創建一個空表,從舊表中查出所有數據插入新表,然后刪除舊表,一般而言,大部分ALTER TABLE操作都會鎖表,導致MySQL服務中斷。
一些ALTER TABLE的技巧
  1. 先在一台不提供服務的機器上執行ALTER TABLE操作,然后和提供服務的主庫進行切換。
  2. 影子拷貝:用要求的表結構創建一張和原表無關的新表,然后通過重命名和刪表操作交換兩張表。
一些ALTER TABLE 可以不進行表重建
  1. 例如修改列的默認值。
  2. 移除一個列的AUTO_INCREMENT屬性。
  3. 增加,移除,或更改ENUM和SET常量。
    • 不重建表的解決方法:為想要的表結構創建一個新的.frm文件,然后用它替換掉已經存在的那張表的.frm文件,具體步驟如下。①:創建一張有相同結構的空表,並進行需要的修改。②:執行FLUSH TABLES WITH READ LOCK。這將會關閉所有正在使用的表,並且禁止任何表被打開。③:交換.frm文件。④:執行UNLOCK TABLES來釋放第2步的鎖。
快速創建MyISAM索引
  1. 高效的創建MyISAM索引:一個常用的技巧是先禁用索引,載入數據,然后重新啟用索引。這是因為構建索引的工作被延遲到數據完全載入以后,這個時候已經可以通過排序來構建索引了。這樣做會快很多,而且使得索引樹的碎片更少,更緊湊。但是這個辦法對唯一索引無效,因為DISABLE KEYS只對非唯一索引有效。MyISAM會在內存中構造唯一索引,並且為載入的每一行檢查其唯一性。
  2. 可以使用如下類似駭客的方式快速創建索引,具體步驟如下。①:用需要的表結構創建一張表,但是不包括索引。②:載入數據到表中以構建.MYD文件。③:按照需要的結構創建另一張空表,這次要包含索引,這會創建需要的.frm和.MYI文件。④:獲取讀鎖並刷新表。⑤:重命名第二張表的.frm和.MYI文件,讓MySQL認為是第一張表的文件。⑥:釋放讀鎖。⑦:使用REPAIR TABLE來重建表的索引。該操作會通過排序來構建所有索引,包括唯一索引。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM