我们有一个大型的 MySQL5.7 生产表。我们尝试降低 Data_free 值。
我们通常只是对各种数据库表运行 Optimize 命令,将其缩小到 7MG 大小。但是,对于一个表,我们无法实现这一点(我们正在使用 innodb_file_per_table)。
有没有办法强制系统将值减小到正常大小?
答案1
您使用的是 ENGINE=InnoDB 吗?所讨论的表是否已分区?
MySQL 的 InnoDB 会预先分配“区段”以备插入新行。这通常(并非总是)显示为 Data_free 正好是 4MB、5MB、6MB 或 7MB。您无法摆脱它。
您是否注意到,该OPTIMIZE TABLE
命令很少会大幅缩小任何表?您是否注意到该操作会阻止表上的其他活动?一般来说,该命令对 InnoDB 表毫无用处。
Data_free 是“碎片”和其他“可用”空间的唯一可见指标。不要为此烦恼。
一个PARTITIONed
“表”由多个“表”组成,每个分区一个。每个子表可能有一些 Data_free。因此整个分区表可以有更大的 Data_free。同样,这个 Data_free 不能缩小(极少数情况除外)。