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即為空洞所佔據的儲存空間。