熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

高性能MySQL:加快ALTER TABLE 操作的速度

2013-11-23 21:09:12  來源: MySQL 

   加快ALTER TABLE 操作的速度

  MySQL 的ALTER TABLE 操作的性能對大表來說是個大問題MySQL 執行大部分修改表結構操作的方法是用新的結構創建一個空表從舊表中查出所有數據插入新表然後刪除舊表這樣操作可能需要花費很長時間如果內存不足而表又很大而且還有很多索引的情況下尤其如此許多人都有這樣的經驗ALTER TABLE 操作需要花費數個小時甚至數天才能完成

  MySQL 以及更新版本包含一些類型的在線操作的支持這些功能不需要在整個操作過程中鎖表最近版本的InnoDB 注 也支持通過排序來建索引這使得建索引更快並且有一個緊湊的索引布局

  一般而言大部分ALTER TABLE 操作將導致MySQL 服務中斷我們會展示一些在DDL操作時有用的技巧但這是針對一些特殊的場景而言的對常見的場景能使用的技巧只有兩種一種是先在一台不提供服務的機器上執行ALTER TABLE 操作然後和提供服務的主庫進行切換另外一種技巧是影子拷貝影子拷貝的技巧是用要求的表結構創建一張和源表無關的新表然後通過重命名和刪表操作交換兩張表也有一些工具可以幫助完成影子拷貝工作例如Facebook 數據庫運維團隊(https://launchpadnet/mysqlatfacebook)的online schema change工具Shlomi Noach 的openark toolkit(http://codeopenarkorg/)以及Percona Toolkit(http://wwwperconacom/software/)如果使用Flexviews(參考 節)也可以通過其CDC 工具執行無鎖的表結構變更

  不是所有的ALTER TABLE 操作都會引起表重建例如有兩種方法可以改變或者刪除一個列的默認值(一種方法很快另外一種則很慢)假如要修改電影的默認租賃期限從三天改到五天下面是很慢的方式

  mysql> ALTER TABLE sakilafilm

  > MODIFY COLUMN rental_duration TINYINT() NOT NULL DEFAULT ;

  SHOW STATUS 顯示這個語句做了 次讀和 次插入操作換句話說它拷貝了整張表到一張新表甚至列的類型大小和可否為NULL 屬性都沒改變

  理論上MySQL 可以跳過創建新表的步驟列的默認值實際上存在表的frm 文件中所以可以直接修改這個文件而不需要改動表本身然而MySQL 還沒有采用這種優化的方法所有的MODIFY COLUMN 操作都將導致表重建

  另外一種方法是通過ALTER COLUMN 注 操作來改變列的默認值

  mysql> ALTER TABLE sakilafilm

  > ALTER COLUMN rental_duration SET DEFAULT ;

  這個語句會直接修改frm 文件而不涉及表數據所以這個操作是非常快的

      返回目錄高性能MySQL

       編輯推薦

       ASPNET MVC 框架揭秘

       Oracle索引技術

       ASP NET開發培訓視頻教程

  數據倉庫與數據挖掘培訓視頻教程


From:http://tw.wingwit.com/Article/program/MySQL/201311/29672.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.