前言
當對mysql進行大量的增刪改操作的時候,很容易產生一些碎片,這些碎片占據著空間,所以可能會出現刪除很多數據后,數據文件大小變化不大的現象。當然新插入的數據仍然會利用這些碎片。但過多的碎片,對數據的插入操作是有一定影響的,此時,我們可以通過optimize來對表的優化。
為了更加直觀的看到數據碎片,Mysql可以使用如下命令查看
show table status [like table_name]
如下圖
?

?
data_free選項代表數據碎片。
針對MySQL的不同數據庫存儲引擎,在optimize使用清除碎片,回收閑置的數據庫空間,把分散存儲(fragmented)的數據和索引重新挪到一起(defragmentation),對I/O速度有好處。
當然optimize在對表進行操作的時候,會加鎖,所以不宜經常在程序中調用。
MyISAM存儲引擎
針對MyISAM表,直接使用如下命令進行優化
optimize table table1[,table2][,table3]
如果同時優化多個表可以使用逗號分隔。
下面優化dede_member_vhistory表,可以看出,優化后data_free值為0。
?

?
#InnoDB存儲引擎
InnoDB引擎的表分為獨享表空間和同享表空間的表,我們可以通過show variables like ‘innodb_file_per_table’;來查看是否開啟獨享表空間。
我本地是開啟了獨享表空間的。此時是無法對表進行optimize操作的,如果操作,會返回如圖信息,最后的一條Table does not support optimize, doing recreate + analyze instead。因為該結構下刪除了大量的行,此時索引會重組并且會釋放相應的空間因此不必優化。
?
