mysql optimize 優化表 回收空間 減小碎片

前言:最近無心中發現mysql數據庫中的A表的空閒數據比較大1.7G,回想一下,是由於A表在最近幾個月由於表數據增加快,進行了兩次分表,把裏面的部分數據從原表DELETE後,INSERT到一個新表裏,所以產生了碎片所致。這無疑會影響索引的使用率,因此咱們須要優化一下。mysql

使用場景:若是您已經刪除了表的一大部分,或者若是您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了不少更改,則應使用OPTIMIZE TABLE。被刪除的記錄被保持在連接清單中,後續的INSERT操做會從新使用舊的記錄位置。您可使用OPTIMIZE TABLE來從新
利用未使用的空間,並整理數據文件的碎片。【當您的庫中刪除了大量的數據後,您可能會發現數據文件尺寸並無減少。這是由於刪除操做後在數據文件中留下碎片所致。】sql

在多數的設置中,您根本不須要運行OPTIMIZE TABLE。即便您對可變長度的行進行了大量的更新,您也不須要常常運行,每週一次或每個月一次便可,只對特定的表運行。數據庫

OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起做用。優化

對於BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。對於InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,這會重建表。重建操做能更新索引統計數據並釋放成簇索引中的未使用的空間。spa

注意:在OPTIMIZE TABLE運行過程當中,MySQL會鎖定表。索引

對於myisam能夠直接使用 optimize table table.name, 當是InnoDB引擎時,會報「Table does not support optimize, doing recreate + analyze instead」,通常狀況下,由myisam轉成innodb,會用alter table table.name engine='innodb'進行轉換,優化也能夠用這個。因此當是InnoDB引擎時咱們就用alter table table.name engine='innodb'來代替optimize作優化就能夠。innodb

相關文章
相關標籤/搜索