我无法释放 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 "Data Base Size in MB", ( data_free )/ 1024 / 1024 "Free Space in MB" FROM information_schema.TABLES where 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。
知道如何解决这个可用空间问题吗?
最佳答案
是的,4M/5M/6M/7M“免费”对于中型到大型InnoDB表来说是正常的。无论 table 大小如何,通常为 4M-7M。你无法摆脱它。 (这对于分区表来说尤其糟糕,因为它发生在每个分区上。)这占空间的百分比是多少?
小表以不同的方式分配,并且通常具有少于4MB的“可用”空间。
15/16 没有显示在 information_schema 中的任何位置,大多数其他类型的“浪费”空间也没有显示。 15/16是在每个 block 中,指的是留一些额外的空间,以避免插入行时 block 突然 split 。
InnoDB 中各种类别的“可用”空间是作为一种优化而存在的,旨在提高查询响应时间,但代价是“浪费”磁盘空间。
关于mysql - 优化Innodb表以释放可用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38258025/