我有一个 InnoDB 表,现在看起来像这样:
该表大约有126GB大,但我读到InnoDB的默认值最多可以容纳64TB的数据。这是正确的吗?
我问这个问题是因为“Data Free”列与“Data Length”相比非常小,我猜很快就会变成 0。
我需要在这里做点什么吗?我的意思是 126GB 与 64 TB 相比根本不算什么。
MySQL 自己管理这一切吗?
非常感谢!
这太期待评论了:
是的,如果只有一个文件,性能就会出现很大问题。在底层,MySQl 使用系统的文件句柄,并且只有一个进程可以写入文件。如果每个表都有一个文件,mysql每个表占用3或4个句柄。这使得(对于系统)扩展表变得更加容易。还有一个文件句柄缓存需要调整。如果没有剩余的可用文件句柄(因为它们定义得不够),MySQL 在读取或写入表时必须关闭另一个表,然后打开新表并可以使用它。但是,如果在下一次查询中需要再次使用旧表,则会发生相反的情况。而这些系统调用,例如打开和关闭文件,需要很长时间才能访问。
此外,一旦使用了磁盘空间,MySQL 就永远不会释放它。虽然内部再次使用,但磁盘上的所有内容都保持不变。
此外,如果发生错误,恢复一个表比恢复包含所有表的怪物文件更容易。
由于您有大量磁盘空间,您可以调整 ini 中的选项,然后复制表并使用 CREATE TABEL 将其复制回来,然后新表将创建为单独的文件。
您会对所实现的速度增益感到惊讶。
默认情况下,
Data_free
不是会耗尽的有限资源。它只是物理文件中已分配的范围(1MB 连续空间)的计数,但不包含任何数据。
InnoDB 表空间通常配置为自动扩展。当前版本的MySQL默认以每表文件的方式存储数据,并且所有此类表空间都是自动扩展的。这意味着如果
data_free
用完,InnoDB 会逐渐增加文件的大小,直到存储空间耗尽。
当每表文件或通用表空间扩展时,它最初会少量增加,然后增加 4MB。
此外,当您更新和删除数据时,它可能会在表空间的页面中留下间隙。一旦这些间隙覆盖整个范围,它们就会计入该表空间的
Data_free
图中。因此,即使物理文件没有增长,Data_free
也会不时增加和减少。
InnoDB 可以在表空间中寻址高达 64TB,但至少对于当前一代服务器,您的存储可能比这个小得多。您将比超出 InnoDB 的可寻址空间更快地填满存储空间。