优化 Innodb 表以释放可用空间
Posted
技术标签:
【中文标题】优化 Innodb 表以释放可用空间【英文标题】:optimizing Innodb table to release free space 【发布时间】:2016-07-08 02:19:18 【问题描述】:我无法释放 innodb 表中的空间。
我还设置了 innodb_files_per_table=1,所以每个表都有单独的 ibd 文件。
当我查询 information_Schema 以检查数据大小、索引大小和 data_free 时,它总是在某些表的 data_free 列中显示一些值,例如 7Mb。查询:
SELECT table_schema "数据库名称", table_name, (data_length + index_length) / 1024 / 1024 "以 MB 为单位的数据库大小", ( data_free )/ 1024 / 1024 “可用空间 (MB)”来自 information_schema.TABLES 其中 table_schema='DB_NAME' order by 4 desc limit 30;
我运行了优化表,也尝试了 alter table table_name engine='innodb',但 data_free 仍然显示 7Mb。
我还启用了 innodb_stats_on_metadata 来刷新统计信息,还刷新表并重新打开表,但 data_free 中仍然显示 7Mb。
知道如何解决这个可用空间问题吗?
【问题讨论】:
这在较大的桌子上很正常。 InnoDB 为filling pages to around 15/16 留下了大约 1/16 的可用空间。这不是问题的迹象。 它不是一张大桌子,它只有 145Mb 的桌子。我看到小桌子上也有空闲空间。像 40Mb 表和可用空间是 5Mb。 抱歉,我应该更清楚地使用“更大”这个词。我正在与您服务器上的其他表进行比较 - 表越大,您就越有可能看到大量可用空间。 不过,我需要回去研究一下答案;我相信答案是“这是正常的”,但这不是因为 15/16 规则,因为这个数字很可能实际上是指未使用页面上的空间,而不是已使用页面上的未使用空间。 【参考方案1】:是的,4M/5M/6M/7M“免费”对于中型到大型 InnoDB 表来说是正常的。它是通常 4M-7M,无论桌子大小。你无法摆脱它。 (这对分区表尤其不利,因为它发生在每个分区上。)那占空间的百分比是多少?
小表的分配方式不同,通常只有不到 4MB 的“可用”空间。
information_schema 中的任何地方都没有显示 15/16,大多数其他类型的“浪费”空间也没有显示。 15/16在每个block里面,是指留一些额外的空间,避免插入行时突然的block split。
InnoDB 中的各种“可用”空间类别作为一种优化存在,以提高对查询的响应时间,但以“浪费”磁盘空间为代价。
【讨论】:
以上是关于优化 Innodb 表以释放可用空间的主要内容,如果未能解决你的问题,请参考以下文章