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可以访问表信息的说明)。