mysql 的 alter table 操做性能小提示

一般狀況下,修改表的結構通常不會有太大問題,無非就是一個 alter table 操做,可是對於大表作 alter 操做是一個大問題,請小夥伴們慎重。mysql

 

  mysql執行大部分修改表結構操做方法是建立一個空表,從舊錶查詢全部的數據插入,而後刪除舊錶。若是內存不足,或者表很大,並且還有不少索引的狀況下,可能須要花費數個小時,甚至數天才能完成。因此若是是操做線上數據庫,甚至會影響到服務的正常進行,操做必定要慎重。若有須要能夠查詢其餘方法操做進行。sql

 

在這裏,若是是修改列的默認值的話,是有一個小技巧的。列的默認值是在 .frm 文件中的,因此修改默認值是能夠直接修改這個文件而不用動到表自己的,可是mysql尚未採用這種優化方法,全部的 modify column 都將重建表。數據庫

一般狀況下,你們修改表的默認值是:優化

   alter table 表名 modify column 字段 ...... default 值;索引

  這樣操做的話,若是表裏面有10000條數據,你會發現,這個語句實際上是作了10000次的查詢和10000次的插入,也就是拷貝了整張表。但其實你只是想改一個列的默認值而已。內存

 

若是用 alter column 來操做的話,那將是很是快的:字符串

  好比: alter table 表名 alter column 字段 set default 值;table

  這裏你會發現只是一瞬間,也不會有多餘的查詢和插入。技巧

 

從上面的例子咱們看到,只修改表的 .frm 文件是很快的。可是mysql有時候會在沒有必要的時候也重建表,若是願意冒一些險,可讓mysql不重建表而作一些其餘類型的修改。固然必定要記得備份,由於這個須要本身承擔風險。方法

下面這些操做有可能不須要從新建表:

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

基本的技術就是爲想要的表結構建立一個新的 .frm 文件,而後替換掉以前已存在的表的 .frm 文件,像這樣:

  1. 建立一張有相同結構的空表,並進行所須要的修改(例如增長 ENUM 的常量);
  2. 執行 FLUSH TABLES WITH READ LOCK 。這將會關閉全部正在使用的表,而且禁止任何表被打開;
  3. 交換 .frm 文件;
  4. 執行 UNLOCK TABLES 來釋放第二步的讀鎖;

注意:再次強調,記得備份。

相關文章
相關標籤/搜索