mysql - 优化Innodb表以释放可用空间

标签 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 "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/

相关文章:

mysql - 更改列的数据类型

python - 自动提交会降低 python 的性能吗?

php - foreach 与 mysqli_multi_query 问题

php - Mysql - 许多表只提供 1 个表用于登录目的

c++ - 返回值(引用、指针和对象)

c++ - 高效的字符串截断算法,顺序删除相等的前缀和后缀

php - 为什么我不应该在 PHP 中使用 mysql_* 函数?

database - db2数据库创建

javascript - 如何让 js 插件在发布时支持 ASP.NET javascript 优化

mongodb - 在 MongoDB 中使用 "_id"插入 key 是否合适?