myisam:optimize table table_name
innodb:alter table table.name engine="innodb’
(資料圖)
1. 問題描述在使用mysql的時候有時候,可能會發現盡管一張表刪除了許多數據,但是這張表表的數據文件和索引文件卻奇怪的沒有變小。這是因為mysql在刪除數據(特別是有Text和BLOB)的時候,會留下許多的數據空洞/碎片,這些空洞會占據原來數據的空間,所以文件的大小沒有改變。這些空洞在以后插入數據的時候可能會被再度利用起來,當然也有可能一直存在。這種空洞不僅額外增加了存儲代價,同時也因為數據碎片化降低了表的掃描效率。
2. 使用場景如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表(含有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即為空洞所占據的存儲空間。
總結1.MySQL官方建議不要經常(每小時或每天)進行碎片整理,一般根據實際情況,只需要每周或者每月整理一次即可。2.OPTIMIZE TABLE只對MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最為明顯。此外,并不是所有表都需要進行碎片整理,一般只需要對包含上述可變長度的文本數據類型的表進行整理即可。3.在OPTIMIZE TABLE運行過程中,MySQL會鎖定表。4.默認情況下,直接對InnoDB引擎的數據表使用OPTIMIZE TABLE,可能會顯示「 Table does not support optimize, doing recreate + analyze instead」的提示信息。這個時候,我們可以用mysqld --skip-new或者mysqld --safe-mode命令來重啟MySQL,以便于讓其他引擎支持OPTIMIZE TABLE。
關鍵詞: