MySQL加快ALTER TABLE操作的速度

標籤(空格分隔): 高性能MYSQL 第四章 schema與數據類型 加快ALTER TABLE操作的速度


  1. MySQL的ALTER

      TABLE操作的性能對來說是個大問題。MySQL執行大部分修改表結構操作的方法是用新的結構創建一個空表,從舊錶中查出所有數據插入新表,然後刪除舊錶。

      一般而言,大部分ALTER TABLE操作將導致MySQL服務中斷。對常見的場景,能使用的 技巧只有兩種:
    1.1. 一種是先在一臺不提供服務的機器上執行ALTER TABLE操作,然後和提供服務的主庫進行切換;

    1.2. 另外一種技巧是“影子拷貝”。影子拷貝的技術是用要求的表結構創建一張和源表無關的新表,然後通過重命名和刪表操作交換兩張表。

  2. 只修改.frm文件

      修改表的.frm文件是很快的,但MySQL有時候會在沒有必要的時候也重建表。如果願意冒一些風險,可以讓MySQL做一些其他類型的修改而不用重建表。

    我們下面要演示的技巧是不受官方支持的,也沒有文檔記錄,並且也可能不能正常工作,採用這些技術需要自己承擔風險。建議在執行之前 首先備份數據!

    下面這些操作是有可能不需要重建表的:

    • 移除(不是增加)一列的AUTO_INCREMENT屬性。
    • 增加、移除,或更改ENUM和SET常量。如果移除的是已經有行數據用到其值的常量,查詢將會返回一個空字串值。

        基本技術是爲想要的表結構創建一個新的.frm文件,然後用它替換掉已經存在的那張表的.frm文件,像下面這樣:
        1. 創建一張有相同結構的空表,並進行所需要的修改(例如增加ENUM常量)。
        2. 執行FLUSH TABLES WITH READ LOCK。這將會關閉所有正在使用的表,並且禁止任何表被打開。
        3. 交換.frm文件(重全名)。
        4. 執行UNLOCK TABLES來釋放第2步的讀鎖。

  3. InnoDB快速載入數據

      在MyISAM中有一個常用的技巧是禁用索引(只能禁用非唯一索引)、載入數據,然後重新啓用索引。在現代版本的InnoDB版本中,有一個類似的技巧,這依賴於InnoDB的快速在線索引創建功能。這個技巧是,先刪除所有的非唯一索引,然後增加新的列,最後重新創建刪除掉的索引。Percona Server可以自動完成這些操作步驟。
      也可以使用像前面據說的ALTER TABLE的駭客訪求來加速這個操作,但需要多做一些工作並且承擔一定的風險。這對從備份中載入數據是很有用的,例如,當已經知道所有數據都是有效的並且沒有必要做唯一性檢查時就可以操作。

    下面是操作步驟:

    1. 用需要的表結構創建一張表,但不包括索引。
    2. 載入數據到表中以構建.MYD文件。
    3. 按照需要的結構創建另外一張空表,這次要包含索引。這會創建需要的.frm和.MYI文件。
    4. 獲取讀鎖並刷新表。
    5. 重命名第二張表的.frm和.MYI文件,讓MySQL認爲是第一張表文件。
    6. 釋放讀鎖。
    7. 使用REPAIR TABLE來重建表的索引。該操作會通過排序來構建所有索引,包括唯一索引。

    這個操作步驟對大表來說會快很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章