天天看點

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

繼續閱讀