MySQL裡面有好幾種回收表空間的方法,但是他們之間的異同是什麼呢?非常感謝提問問題的同學,我在這裡總結下。
有三種方法:
OPTIMIZE TABLE tbname
ALTER TABLE ... FORCE
ALTER TABLE tbname ENGINE= INNODB
OPTIMIZE TABLE的支援表類型:INNODB,MYISAM, ARCHIVE,NDB;會重組表資料和索引的實體頁,對于減少所占空間和在通路表時優化IO有效果。
在InnoDB表中等價 ALTER TABLE ... FORCE,ALTER TABLE ENGINE= INNODB,會重新整理在聚簇索引上的資料和索引;
這意味着,我們在内部建立一個新的表,就像現有的表一樣,然後我們将資料一次一行地加載到一行中。對于聚集索引(又稱主鍵),如果資料被插入到順序之外,或者如果已經進行了修改,這就造成了一些影響填充因素的間隙,可能會導緻一些空間浪費。
對于二級索引,它們将按聚集索引順序依次加載一行,這可能導緻他們直接回到支離破碎的狀态。而且InnoDB的MVCC實作在二級索引中确實有多個版本,是以可能在這裡回收空間。
對于InnoDB和分區表, 在MySQL 5.6.17之前,OPTIMIZE TABLE在拷貝表的過程中,在SQL層會鎖表,執行時DML會阻塞;在MySQL 5.6.4之後在執行OPTIMIZE TABLE時可以同時執行DML。
阿裡雲的RDS 5.6已經支援Online OPTIMIZE.
對于MYISAM表,OPTIMIZE TABLE非常重要:
如果表已删除或分隔行,就修複該表。
如果索引頁沒有排序,就排序它們。
如果表的統計資訊不是最新的(而且修複不能通過對索引進行排序),就更新它們。
注:
需要有足夠的空間才能進行OPTIMIZE TABLE。如果沒有磁盤空間,MySQL将不能進行優化,表也無法使用。
<a href="https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html">https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html</a>
<a href="https://mysqlserverteam.com/mysql-5-6-17-improved-online-optimize-table-for-innodb-and-partitioned-innodb-tables/">https://mysqlserverteam.com/mysql-5-6-17-improved-online-optimize-table-for-innodb-and-partitioned-innodb-tables/</a>
<a href="http://www.tocker.ca/2013/05/02/optimize-check-repair-analyze-table-innodb-edition.html">http://www.tocker.ca/2013/05/02/optimize-check-repair-analyze-table-innodb-edition.html</a>