使用 MyISAM 是否使恢复磁盘 space 更有效率?

Does using MyISAM make recovering disk space more efficient?

我有一个每晚的 cron 作业,它删除特定 table 中超过 30 天的所有行。这个 table 发生了很多变动,而且变动幅度很大。删除这些行后,我还调用了 OPTIMIZE TABLE,这又是 ,因为它是一个 InnoDB table。

偶尔,我 运行 遇到服务器 运行 磁盘不足 space 的问题,因为它需要复制数据以重新创建 table.

将那个特定的 table 切换到 MyISAM,同时将我的数据库的其余部分保留为 InnoDB 会更有效并防止我的服务器 运行 耗尽磁盘 space 吗?或者换句话说,如果它在 MyISAM 而不是 InnoDB 中,OPTIMIZE TABLE 会更像那个特定 table 上的 trim 吗?

MyISAM和InnoDB都有磁盘space长不缩的“缺陷”。两者都重用释放的space,所以情况还不错。

MyISAM 删除 table 中的空洞。这些洞连在一起。新插入的行将使用这些孔,即使这意味着将一行分成几块。这导致 MySQL 中为数不多的 OPTIMIZE TABLE.

需求之一

另一方面,InnoDB 主要处理漏洞,因此(通常)不需要 OPTIMIZE。我建议你停止做 OPTMIZE.

允许数据集变得如此之大以至于没有足够的磁盘 space 来 ALTER 最大的 table 是愚蠢的。你似乎处于那个位置。与 InnoDB 相比,MyISAM table 很可能只占用一半的磁盘 space。

与其每月删除,不如尝试每天删除。这将使 table 在其峰值时减少 29 天的价值。有关大删除的更多提示:http://mysql.rjweb.org/doc.php/deletebig

关于 PARTITIONing 的更多信息,尤其是对于像您这样的时间序列:http://mysql.rjweb.org/doc.php/partitionmaint

如果您想分享SHOW CREATE TABLE;我们可能还有其他减少磁盘占用空间的技巧。

(我也不建议切换到 MyISAM。它在集群系统上是不允许的,并且可能会在不久的将来从 MySQL 中删除。)