1. 程式人生 > >mysql進階:optimize table命令

mysql進階:optimize table命令

在使用mysql的時候有時候,可能會發現儘管一張表刪除了許多資料,但是這張表表的資料檔案和索引檔案卻奇怪的沒有變小。這是因為mysql在刪除資料(特別是有Text和BLOB)的時候,會留下許多的資料空洞,這些空洞會佔據原來資料的空間,所以檔案的大小沒有改變。這些空洞在以後插入資料的時候可能會被再度利用起來,當然也有可能一直存在。這種空洞不僅額外增加了儲存代價,同時也因為資料碎片化降低了表的掃描效率。

使用場景:如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了很多更改,則應使用OPTIMIZE TABLE。被刪除的記錄被保持在連結清單中,後續的INSERT操作會重新使用舊的記錄位置。您可以使用OPTIMIZE TABLE來重新

利用未使用的空間,並整理資料檔案的碎片。【當您的庫中刪除了大量的資料後,您可能會發現資料檔案尺寸並沒有減小。這是因為刪除操作後在資料檔案中留下碎片所致。

在多數的設定中,您根本不需要執行OPTIMIZE TABLE。即使您對可變長度的行進行了大量的更新,您也不需要經常執行,每週一次或每月一次即可,只對特定的表執行。

OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。

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

注意:在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做優化就可以。

檢視前後效果可以使用show table status命令,例如show table status from [database] like '[table_name]';返回結果中的data_free即為空洞所佔據的儲存空間。