优化Innodb表以释放可用空间

时间:2016-07-08 02:19:18

标签: mysql database optimization innodb fragmentation

我无法在innodb表中释放空间。

我还设置了 innodb_files_per_table = 1 ,因此每个表都有单独的ibd文件。

当我查询information_Schema以检查数据大小,索引大小和data_free时,它总是在某些表的data_free列中显示一些值,如7Mb。查询:

  

SELECT table_schema“Data Base Name”,table_name,(data_length +   index_length)/ 1024/1024“以MB为单位的数据库大小”,(data_free)/   1024/1024“MB中的可用空间”来自information_schema.TABLES其中   table_schema ='DB_NAME'顺序由4个desc限制30;

我运行优化表,也尝试了 alter table table_name engine ='innodb',但data_free仍显示7Mb。

我还启用了 innodb_stats_on_metadata 来刷新统计信息,还可以刷新表并重新打开表,但仍然在data_free中显示7Mb。

知道如何解决这个免费空间问题吗?

1 个答案:

答案 0 :(得分:1)

是的,对于中型到大型的InnoDB表,4M / 5M / 6M / 7M“free”是正常的。无论表大小如何,通常 4M-7M。你无法摆脱这一点。 (这对于分区表尤其有用,因为它出现在每个分区上。)这个空间的百分比是多少?

小表以不同的方式分配,通常的“空闲”空间少于4MB。

15/16未在information_schema中的任何位置显示,大多数其他类型的“浪费”空间也未显示。 15/16在每个块中,并且指的是留出一些额外的空间以避免在插入行时突然发生块分裂。

InnoDB中各种类型的“免费”空间作为优化来提高查询响应时间,代价是“浪费”磁盘空间。