在同一个MySQL(v.5.5)服务上,我有多个数据库。
其中一个数据库有一个包含29&000; 000&#39,000记录(3.3 GiB)的表。
当我删除一些记录时,MySQL似乎只保留当前表的可用空间。我看到表检查器(MySQL Workbench):Data Free 1.4 GiB。
我错了或表使用的空间永远不会被其他表或其他数据库重用?
答案 0 :(得分:2)
您评论说您没有使用innnodb_file_per_table=1
,您应该知道“无数据”是整个表空间(ibdata1
)中的可用空间量。
如果使用innodb_file_per_table=1
,则每个表空间只有一个表,报告的可用空间将用于该表空间。在该模式下,“无数据”仅适用于存储在该表空间中的单个表。
如果使用innodb_file_per_table=0
,则所有表共享一个公共系统表空间(默认情况下称为ibdata1
)。 “无数据”可供该表空间中的任何表使用。例如,如果从表中删除或删除表,则释放的空间可能会被一个或多个不同的表自动使用。您无需执行任何操作即可将空间重新分配给其他表。
即使为每个表显示“无数据”,实际可用空间也不是每个表专用,也不是乘以您拥有的表数。
简而言之,它是每个表空间的可用空间,而不是每个表。
“数据免费”中只计算完全免费范围。范围是1MB的数据页面。换句话说,64个连续页面,默认大小各16KB。表空间中可能存在较小组中的其他可用页面。单个页面中可能还有一些可用空间。这些都不包含在“无数据”统计中。
答案 1 :(得分:1)
与其他一些引擎不同,InnoDB通常不会回收自由空间,这意味着您的表一旦达到一定的大小,就会永久地保留在那里。恢复这个空间的一种方法是有点痛苦的OPTIMIZE TABLE
命令,它可以重建并重新索引表,从而释放它。
这会在一段时间内锁定表格,在大型表格上可能需要数小时,因此请小心使用。