mysql - 使用 MyISAM 是否可以更有效地恢复磁盘空间?
问题描述
我有一个每晚的 cron 作业,它删除特定表中超过 30 天的所有行。这张表的流失率很高,而且大小差异很大。删除这些行后,我还调用OPTIMIZE TABLE
which 反过来重新创建表,因为它是 InnoDB 表。
有时,我会遇到服务器磁盘空间不足的问题,因为它需要复制数据才能重新创建表。
将该特定表切换到 MyISAM 同时将我的数据库的其余部分保留为 InnoDB 会更有效并防止我的服务器耗尽磁盘空间吗?或者换句话说,OPTIMIZE TABLE
如果它在 MyISAM 而不是 InnoDB 中,它会更多地作为对该特定表的修剪?
解决方案
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 中移除。)
推荐阅读
- python - 在 Python 中向 sftp 子进程发送密码
- here-api - RouteFeatureWeightType 究竟是如何工作的?
- blockchain - 重新派遣功能的费用
- php - PHP Regex - 无法获取可选的命名捕获组
- html - 如何修复我的 htaccess,它将我的页面全部重定向到一个索引
- spring - 如何用 webclient 替换 resttemplate 实现
- google-cloud-storage - 谷歌数据洞察,最大数据限制?
- ionic-framework - 如何获得谷歌 IdToken?
- c - 在正则表达式中匹配正斜杠
- git - 代理问题的 git config