首页 > 解决方案 > 使用 MyISAM 是否可以更有效地恢复磁盘空间?

问题描述

我有一个每晚的 cron 作业,它删除特定表中超过 30 天的所有行。这张表的流失率很高,而且大小差异很大。删除这些行后,我还调用OPTIMIZE TABLEwhich 反过来重新创建表,因为它是 InnoDB 表。

有时,我会遇到服务器磁盘空间不足的问题,因为它需要复制数据才能重新创建表。

将该特定表切换到 MyISAM 同时将我的数据库的其余部分保留为 InnoDB 会更有效并防止我的服务器耗尽磁盘空间吗?或者换句话说,OPTIMIZE TABLE如果它在 MyISAM 而不是 InnoDB 中,它会更多地作为对该特定表的修剪?

标签: mysqlinnodbmyisam

解决方案


MyISAM 和 InnoDB 都存在磁盘空间增大但不缩小的“缺陷”。两者都重用了释放的空间,所以情况还不错。

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

另一方面,InnoDB 主要负责处理漏洞,从而导致(通常)不需要OPTIMIZE. 我建议你停止做OPTMIZE.

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

不要每月删除,而是每天尝试。这将使该表在其高峰期的价值减少 29 天。关于大删除的更多提示:http: //mysql.rjweb.org/doc.php/deletebig

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

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

(我也不建议切换到 MyISAM。集群系统上是不允许的,近期可能会从 MySQL 中移除。)


推荐阅读