MySQL的 data_free,表碎片整理

許願流星1號發表於2015-12-14
在MySQL中,我們經常會使用VARCHARTEXTBLOB等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——MySQL資料表碎片整理。
每當MySQL從你的列表中刪除了一行內容,該段空間就會被留空。而在一段時間內的大量刪除操作,會使這種留空的空間變得比儲存列表內容所使用的空間更大。
當MySQL對資料進行掃描時,它掃描的物件實際是列表的容量需求上限,也就是資料被寫入的區域中處於峰值位置的部分。如果進行新的插入操作,MySQL將嘗試利用這些留空的區域,但仍然無法將其徹底佔用。


1.或者檢視某個表所佔空間,以及碎片大小。

select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from information_schema.tables where TABLE_SCHEMA='db002';
或者

select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from information_schema.tables where TABLE_SCHEMA='db002' and data_free !=0;


2、整理表的碎片
optimize table aaa_safe,aaa_user,t_platform_user,t_user;

提示該表不支援 optimize,但是下邊有顯示OK.其實已經執行成功了。5.6.X的版本,其實已經支援Innodb了。
整理完畢


針對以前版本:
大致意思是說innodb的資料庫不支援optimize,可以用 
ALTER TABLE table.name ENGINE='InnoDB'; 
該方法會對舊錶以複製的方式新建一個新表,然後刪除舊錶。雖然這個過程是安全的,但是在進行操作時還是先進行備份為好 

也可以在啟動資料庫的時候指定--skip-new或者--safe-mode選項來支援optimize功能

[root@wg ~]# service mysql start --skip-new

OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。

 

對於MyISAM表,OPTIMIZE TABLE按如下方式操作:

1.     如果表已經刪除或分解了行,則修復表。

2.     如果未對索引頁進行分類,則進行分類。

3.        如果表的統計資料沒有更新(並且透過對索引進行分類不能實現修復),則進行更新。

 

對於BDB表,OPTIMIZE TABLE目前被對映到ANALYZE TABLE上。

對於InnoDB表,OPTIMIZE TABLE被對映到ALTER TABLE上,這會重建表。重建操作能更新索引統計資料並釋放成簇索引中的未使用的空間。


備註
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或者d --safe-mode命令來重啟MySQL,以便於讓其他引擎支援OPTIMIZE TABLE

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29893219/viewspace-1871911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章