1. 程式人生 > >【五】高效能MySql筆記——快速ALTER TABLE(Hack手法)

【五】高效能MySql筆記——快速ALTER TABLE(Hack手法)

    MySql中大資料表的ALTER TABLE操作是非常耗時的。今天討論下如何快速完成表結構的修改?

    ALTER TABLE的原理是用新結構建立一張新表,然後將舊錶的資料拷貝進新表,最後再刪除舊錶。ALTER TABLE會導致資料操作服務中斷。常用的方式是主備切換影子拷貝

    主備切換:先在一臺不提供服務的機器上執行ALTER TABLE操作,然後和提供服務的主庫進行切換。

    影子拷貝:用要求的表結構建立一張和源表無關的新表,然後通過重新命名和刪除表操作交換兩張表。

    Hack手法

    理論:由於MySql表中列的預設值實際上存在表的.frm檔案中,所以可以直接修改這個檔案而不需要改動表本身。MySql官方並沒有採用這種優化方法,所有的MODIFY COLUMN操作都將導致表重建。或者我們可以使用ALTER COLUMN,這句話可以直接修改.frm檔案而不涉及表資料。因此ALTER COLUMN操作比ALTER TABLE操作快很多。

    方法:直接修改.frm檔案的方法雖然可以快速修改表,但卻存在一定的風險,所以在使用時應該考慮清楚。基本技術是建立一個新的.frm檔案,然後替換掉舊的.frm檔案。

    步驟

        ①建立一張有相同結構的空表,並進行所需要的修改;

        ②執行FLUSH TABLES WITH READ LOCK鎖定所有正在使用的表;

        ③交換.frm檔案;

        ④執行UNLOCK TABLES解鎖所有表。




    不需要建立表的情況

        ①移除(不是增加)一個列的AUTO_INCREMENT屬性;

        ②增加、移除,或更高ENUM和SET常量。如果移除的是已經有行資料用到其值的常量,查詢將會返回一個空字串值。

    快速建立MyISAM索引

    高效的載入資料到MyISAM表中的方法:先禁用索引、載入資料、然後重新啟用索引。優點:此方法是將構建索引的工作延遲到資料完全載入之後,這時就可以使用排序來構建索引了,還可以減少索引樹的碎片,使索引更緊湊。缺點:對唯一索引無效,DISABLE KEYS只對非唯一索引有效。

    注意:MyISAM會在記憶體中構造唯一索引,並且為載入的每一行檢查唯一性。一旦索引的大小超過了有效記憶體大小,載入操作就會變得越來越慢。因此對於InnoDB有一個類似的技巧:依賴InnoDB的快速線上索引建立功能,先刪除所有唯一索引,然後增加新的列,最後重新建立刪除掉的索引。

// 禁用索引
ALTER TABLE <table> DISABLE KEYS;
// 啟用索引
ALTER TABLE <table> ENABLE KEYS;

    步驟

        ①用需要的表結構建立一張表,但是不包括索引;

        ②載入資料到表中以構建.MYD檔案;

        ③按照需要的結構建立另外一張空表,這次要包含索引。這會建立需要的.frm和.MYD檔案;

        ④獲取讀鎖並重新整理表;

        ⑤重新命名第二張表的.frm和.MYD檔案,讓MySql人為是第一張表的檔案;

        ⑥釋放讀鎖;

        ⑦使用REPAIR TABLE重建表索引。