为什么与PostgreSQL相比,Mysql不需要使用真空?

35

我比较熟悉PostgreSQL而非MySQL。曾经在PostgreSQL数据库中遇到过Wraparound Id失败的问题,后来理解了在数据库中进行清理(vacuuming)操作的重要性。实际上,这是一项很繁琐的工作,需要做大量的额外处理(特别是对于旧版本7.4.3),但几个月前已更新至自动清理(autovacuum)功能。相比之下,与PostgreSQL相比,假设MySQL不必像PostgreSQL那样面对这些额外负担。这种假设是否正确?

另外,为什么MySQL数据库不需要像PostgreSQL数据库那样进行清理操作(vacuum)? 是否有其他优化替代方案类似于MySQL数据库可以使用的vacuum?


1
实际上,处理这样的大量开销工作真是太繁琐了。你是否了解自动清理?在现代Postgres中,默认情况下会自动覆盖您的需求,除非有特殊需要。 - Erwin Brandstetter
@ErwinBrandstetter:这是在使用一个旧系统时发生的,该系统使用的是PostgreSQL 7.4.3版本,其中没有自动清理功能。几个月前,数据库已更新到最新版本,现在没有了额外开销。实际上,我忘记提到这是很久以前的事情了。 - RunningAdithya
1
那就解释了。是的,值得一提。 - Erwin Brandstetter
2个回答

31
MySQL对PostgreSQL中的vacuum进行的近似功能是OPTIMIZE TABLE tablename (MySQL文档)。它在MySQL中执行类似于PostgreSQL的功能,具体取决于所使用的存储引擎,它可以回收未使用的空间,重新组织索引和表,并整理数据文件。就像在PostgreSQL中一样,您应该定期运行它。

30

罗伯特·哈斯(Robert Haas)在这个话题上发表了评论

简而言之,InnoDB使用回滚日志,更像Oracle的设计。只保留主要表的最新版本。它必须管理日志清除,这是一个相关函数与PostgreSQL的VACUUM一样是一种异步/延迟操作。

这意味着在更新时需要进行更多的写入,并且访问旧行版本的速度要慢得多,但可以摆脱异步VACUUM的必要性,并且不会出现表膨胀问题。相反,您可以拥有巨大的回滚段或用尽回滚空间。

因此,这是一种权衡,具有不同一组优点和问题的设计。

如果你谈论的是MyISAM表,那么就完全不同了。PostgreSQL的表不会吞噬你的数据。MyISAM会。PostgreSQL的表是事务性的。MyISAM不是。平面文件也不需要VACUUM,这并不是一个好主意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接