innodb在執行删除時,隻是實體上做了被删除的标記,實際上并沒有從資料檔案中真正删除。即,所占用的空間也沒有實際釋放。背景的purge線程會定期清理這些已經删除的記錄和檔案,但并不會回收這些已經删除的空間給作業系統,即會在資料檔案中産生許多空洞,資料檔案也會越來越大。
檢視空洞的方法:
通過SHOW TABLE STATUS的結果,檢視實際資料Data_length和空洞資料Data_free的比例。如果Data_free特别大,說明這個表需要優化了,優化方法可以使用ALTER TABLE table_name ENGINE = INNODB;
mysql> show table status like 't2'\G
*************************** 1. row ***************************
Name: t2
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 13
Avg_row_length: 1260
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-11-16 05:23:08
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
show table status顯示的每個列的意義如下:
Name:表名
Engine:存儲引擎類型
Version:.frm檔案的版本号?
Row_format:行格式
Rows:表中行數,INFORMATION_SCHEMA下的表是NULL
Avg_row_length:平均行長度
Data_length:Myisam表時資料檔案的大小,機關位元組
:innodb表指聚集索引配置設定的記憶體大小,以頁的大小為機關
Max_data_length:myisam表資料檔案的最大長度。如果給定了資料指針的大小,這是可以被存儲在表中的資料的位元組總數。
:InnoDB表未使用
Index_length:MyISAM表索引檔案大小;InnoDB表二級索引的大小
Data_free:配置設定但未使用的位元組大小
Auto_increment:AUTO_INCREMENT的下一個值
Create_time:表建立時間
Update_time:表最近更新的實際
Check_time:表最近check的實際
Collation:The table's character set and collation.
Checksum:checksum值
Create_options:CREATE TABLE的額外選項
Comment:建立表時使用的評注(或者有關為什麼MySQL可以通路表資訊的說明)。