mysql 的 alter table 操作性能小提示


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

 

  mysql執行大部分修改表結構操作方法是創建一個空表,從舊表查詢所有的數據插入,然后刪除舊表。如果內存不足,或者表很大,而且還有很多索引的情況下,可能需要花費數個小時,甚至數天才能完成。所以如果是操作線上數據庫,甚至會影響到服務的正常進行,操作一定要慎重。如有需要可以查詢其他方法操作進行。

 

在這里,如果是修改列的默認值的話,是有一個小技巧的。列的默認值是在 .frm 文件中的,所以修改默認值是可以直接修改這個文件而不用動到表本身的,但是mysql還沒有采用這種優化方法,所有的 modify column 都將重建表。

通常情況下,大家修改表的默認值是:

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

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

 

如果用 alter column 來操作的話,那將是非常快的:

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

  這里你會發現只是一瞬間,也不會有多余的查詢和插入。

 

從上面的例子我們看到,只修改表的 .frm 文件是很快的。但是mysql有時候會在沒有必要的時候也重建表,如果願意冒一些險,可以讓mysql不重建表而做一些其他類型的修改。當然一定要記得備份,因為這個需要自己承擔風險。

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

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

基本的技術就是為想要的表結構創建一個新的 .frm 文件,然后替換掉之前已存在的表的 .frm 文件,像這樣:

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

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

 


免責聲明!

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



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