天天看點

MySQL裡的回收表空間前言回收表空間參考

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>