1. 程式人生 > >Optimize Table整理MySQL表空間

Optimize Table整理MySQL表空間

Optimize Table table_name 該命令會整理表的資料和索引的物理儲存內容,可以減少磁碟空間、提高I/O的訪問效率。該命令對不同儲存引擎下的表作用不同。

Optimize Table適用場景:

   1. InnoDB表做了大量的insert、update、delete操作,並且每個表一個ibd檔案(設定了innodb_file_per_table值為ON)。

  2.  InnoDB表全文索引的部分列做了大量的insert、update、delete操作,需要設定innodb_optimize_fulltext_only = 1

  3.  對AyISAM表或者Archive表執行delete操作刪除了大量資料,這部分資料只是在記錄中標記刪除,下次插入資料時可以重用這部分資料,實際上磁碟空間並沒有釋放。

  4. 對記憶體中的NDB表的可變資料列進行大量的修改。

 

Optimieze Table所做的操作:

 對InnoDB表,該操作重建表更新索引的統計資料並釋放未使用的空間。

 optimize table操作使用Online DDL模式修改Innodb普通表和分割槽表,該方式會在prepare階段和commit階段持有表級鎖:在prepare階段修改表的元資料並且建立一箇中間表,在commit階段提交元資料的修改。由於prepare階段和commit階段在整個事務中的時間比例非常小,可以認為該optimize table的過程中不影響表的其他併發操作。

optimize table操作使用copy table而不是Online DDL的方式修改InnoDB的全文索引列。

 

對MyISAM表: 釋放空間;索引沒有排序的話進行排序;如果有需要的話更新統計資料。

 

詳細描述參考官網:https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html

 

測試範例:

1. 建立一張測試表,批量插入3700W條記錄,初始ibd檔案為6.1G

2. 執行optimize table,執行幾分鐘報錯。

  

3. 再次執行該命令,檢查系統狀態,發現當前磁碟使用率100%。應該是optimize操作佔用磁碟資源導致的。刪除掉系統部分空間,重新執行該命令,執行了將近37min

才執行成功,在此期間optimize操作佔用磁碟空間最高達到10.7G,近似是表當前大小的2倍, cpu單核佔用率100%,後臺一致在進行檔案操作。該表進行併發select和update操作沒有阻塞,證明確實是採用Online DDL模式工作。執行完成後該表的ibd檔案從6.1G降低到4.9G

 

 

 

4.執行delete操作刪掉一半記錄數(1870W), 此時資料檔案大小沒有改變:

[[email protected] ~]# du -sh /var/lib/mysql/envision/ed_fan_data.*

12K /var/lib/mysql/envision/ed_fan_data.frm

4.9G /var/lib/mysql/envision/ed_fan_data.ibd

5. 執行optimize table結束後,此時資料檔案大小減少為原來的一半:

[[email protected] ~]# du -sh /var/lib/mysql/envision/ed_fan_data.*

12K /var/lib/mysql/envision/ed_fan_data.frm

2.4G /var/lib/mysql/envision/ed_fan_data.ibd