产生:
使用MySQL,每当对表记录进行删除时,该片段空间就会被留空。长期时间下来或者当大量记录被删时,有可能留空的空间比存储表(结构、数据、索引)的空间还要大。这样一来,当MySQL扫描数据时,实际上扫描的是表的容量需求上限。也就是数据被写入的区域中处于峰值位置的部分。如果进行新的插入操 作,MySQL将尝试利用这些留空的区域,但仍然无法将其彻底占用。这种额外的破碎的存储空间在读取效率方面比正常占用的空间要低得多。
查看数据库中各个表的碎片空间情况:
select table_schema, table_name, CONCAT(TRUNCATE(data_free/1024/1024,2),'MB') data_free, engine from information_schema.tables where table_schema = '数据库名' and data_free > 0;
清理:
对此,MySQL提供了清理碎片的方法:
OPTIMIZE TABLE tab_name;
tips:
对于该方法,需要注意的是执行的时候会产生表锁,因此对于体积巨大的列表应尤其注意使用。OPTIMIZE TABLE 只对MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最为明显。此外,并不是所有表都需要进行碎片整理,一般只需要对包含varchar、text、blob、float等可变长度的文本数据类型的表进行整理即可。一般根据实际情况,两周或一个月进行碎片清理即可。