PostgreSQL和MySQL是世界上最流行的两种关系数据库管理系统(RDMS)。包括商业企业和开源基金会在内的所有市场人口都在使用它们。它们的共同点是强大的网络容错能力和对数据聚类的支持。这篇文章的主题是将它们区分开来。

RDMS起源和历史

1973年,加州大学伯克利分校启动了一个名为“Ingres”的项目,为关系数据库管理系统制定新标准。该项目是用C编写的,并根据开源许可证向公众发布。根据[Wikipedia关于此事的文章](https://en.wikipedia.org/wiki/Ingres_(database),Ingres的优势在于它使用了QUEL,与SQL相比,QUEL是一种更正式但更精确的查询语言。

1985年,该项目在伯克利以“Postgres”的名义进行了修改,后来改为“PostgreSQL”,以确认SQL的可访问性。1994年,Michael Wideius创建了一款名为“MySQL”的竞争产品。该产品于2010年由甲骨文通过公司收购收购。

这揭示了两者之间的第一个主要区别-PostgreSQL是一个由社区支持志愿者维护的免费产品,而MySQL是一个具有专业部署和支持的公司产品。

PostgreSQL与MySQL-缺失功能列表

2017年9月5日,黑客新闻用户“kaamos”发布了MySQL中存在的功能列表,但在当时最新版本的PostgreSQL 9.2.23中缺失:

  • 用户变量

  • 优化器提示

  • 虚拟列

  • 优化器跟踪

  • 聚集索引

  • 声明性分区

  • emi同步复制

  • 内置事件调度程序和逻辑复制

  • 能够在创建数据库时选择数据页大小

  • 具有自动分片的分布式内存网格

  • 同步多主群集(Galera,组复制)

  • 页面级压缩、加密和增量备份

  • 编写类似MyRocks和TokuDB的优化存储引擎

  • NoSQL客户端API(HandlerSocket、memcached协议、X协议)

  • 使用ALTER TABLE添加新列时指定列顺序的能力

  • 高效的MVCC实现,不受XID环绕问题和真空问题的影响

Kaamos指出,这些功能“对于设计和运营互联网上最繁忙网站的人来说是巨大的,(w)这可能是MySQL仍然在该领域大放异彩的原因。”

在回复kaamos的功能愿望列表时,用户“fusiongyro”回答说,MySQL中的高级复制策略由于分布式一致性错误而导致“脱发和离婚”。根据他的经验,最终用户认为MySQL复制功能将在没有规划或监督的情况下按预期运行。当这种假设失败时,他们会经历一系列停机和错误。

2019年PostgreSQL与MySQL讨论

PostgreSQL vs MySQL上的2019年黑客新闻线程提供了更多关于开发者共识的见解,即哪种更好。用户“matthewmacleod”建议使用PostgreSQL作为默认RDM,除非有理由不这样做。用户“jerrytsai”表示,PostgreSQL在科学意义上具有更好的数据分析功能。

“Madhadron”建议开发者使用他们更熟悉的东西。该用户指出,部署的简易性与长期可行性无关。用户“nmpennypacker”补充说,PostgreSQL在本地强制执行数据类型,而MySQL没有。该用户表示,MySQL中随意使用的数据类型可能会导致“污染数据”。

用户“gtsteve”表示,PostgreSQL和MySQL对客户端驱动程序有不同的许可。在他看来,MySQL偷偷摸摸地将驾照制度改得更加严格。“CameronNemo”补充说,目标是吸引开发人员使用他们认为自由的源代码,然后在审计后对他们收费。

“Evanelias”透露,他在MySQL上做了大量工作,可能对MySQL有偏见,但他承认MySQL的“电池”更少。根据该用户的说法,两者都可以,不过团队的经验应该是决定因素。越来越多的人精通MySQL的使用,尽管MySQL在规范方面不如PostgreSQL,但MySQL可能会向有利于MySQL的方向倾斜。

图片来源:unsplash.com

PostgreSQL vs MySQL-优步交换机

2016年,优步工程(Uber Engineering)发表了一篇由埃文·克利兹克(Evan Klitzke)撰写的文章(https://eng.uber.com/postgres-to-mysql-migration/),解释了该公司为什么从PostgreSQL迁移到MySQL。简而言之,PostgreSQL有一些主要缺点,阻碍了优步扩展和旋转以集成新的服务和数据平台。

本文列举了以下缺点:

1、有限的架构

2、表格腐败问题

3、难以升级到新版本

有限的架构

有限的架构缺陷是指PostgreSQL写入和更新数据的方式。PostgreSQL设计为具有不可变的行数据。如果需要更新行数据,PostgreSQL将为其创建新行,并更新与之相关的所有索引。与数据相关的索引越多,更新越多。

对于Postgres,主索引和辅助索引都直接指向磁盘元组偏移。当元组位置更改时,必须更新所有索引。来源:eng.uber.com

Evan将这个问题称为“写入放大”,即向数据库写入几个字节会给整个系统带来过度的带宽负担。如果所有数据库都在一个数据中心,这是可以容忍的;当时,优步在美国有两个数据中心集群,每个海岸一个,因此产生了巨大的带宽成本。

表腐败问题

再加上这个问题,由于没有在数据库的所有实例中正确更新索引以指示最新的实例,表可能会损坏。在某些情况下,旧的一行仍被标记为最新的一行。只有一小部分行受到此错误的影响,但这可能是灾难性的。

埃文指出,优步通过对主机进行快照并从中重新同步所有数据库,解决了这个问题,他将此描述为一个费劲而复杂的过程。Evan承认,在撰写本文时,该漏洞已经修复,但他担心它出现了,并且可能在未来出现丑陋的头部。

难以升级到新版本

为了将PostgreSQL从9.2更新到9.3,Evan和他的团队不得不关闭主数据库并运行pg \ \u升级,这一命令可能需要很多小时。在这段时间内,主数据库无法服务于任何通信。在那之后,团队必须创建主服务器的新快照,并将其传播到副本中,这是另一个耗时的过程。随着优步数据库的大幅增加,超过9.3版本的更新过程也将增加,导致大量停机。

MySQL的优势

埃文说,MySQL允许优步利用更新的技术。此外,MySQL有几种复制模式,为优步提供了灵活性,减少了灾难性损坏的可能性。如果MySQL出现故障,受影响的行数据将不可用,但数据库将保持功能。

MySQL使用了额外的间接层。来源:eng.uber.com

MySQL还提供了更大的版本兼容性,允许优步在方便的时候更新数据库。Evan将实际效果描述为“几乎零停机时间”。总之,Evan表示,PostgreSQL的扩展给公司带来了“重大问题”,尽管优步仍运行着一些遗留的PostgreSQL实例。

马库斯·温南德对优步博客的回应

优步文章公开三天后,奥地利SQL教育家马库斯·温纳德(Markus Winand)发表了反驳。在他看来,这篇文章没有足够清楚地表明PostgreSQL没有错;这对优步来说是无效的,因为优步需要不断更新数据。

Markus注意到PostgreSQL文档解释了Evan和他的团队本可以使用的模糊函数。Markus补充说,无论公司规模大小,开发人员对SQL的了解都“低得离谱”,这使得他们对关系数据库感到困惑。他得出结论,优步没有切换到MySQL;相反,优步制作了一个名为“无模式”的定制解决方案,并支持MySQL。

PostgreSQL与MySQL架构

PostgreSQL构建在为对象关系数据库设计的架构上,而MySQL使用严格的关系架构。不同之处在于,PostgreSQL允许更复杂的数据,但牺牲了部署的复杂性和更高的维护要求。

数据类型支持比较

根据W3Schools对MySQL的描述,它支持三种数据类型:

  • 一串

  • 数字

  • 日期和时间

根据官方文档,PostgreSQL支持21种数据类型:

  • XML

  • JSON

  • UUID

  • 范围

  • 阵列

  • pg\ U lsn

  • 领域

  • 布尔型

  • 数字

  • 位字符串

  • 性格

  • 货币的

  • 日期/时间

  • 几何的

  • 混合成的

  • 文本搜索

  • 二进制数据

  • 枚举

  • 对象标识符

  • 网络地址

同一个文档页面声明PostgreSQL支持使用“创建类型”创建新的数据类型,该类型进一步分为四个版本:

  • 基础

  • 范围

  • 混合成的

  • 枚举

应小心使用此命令,因为它可能会使服务器崩溃或妨碍数据库管理。

索引支持比较

PostgreSQL文档解释了系统支持六种索引类型:

  • 杜松子酒

  • 搞砸

  • 主旨

  • 布林

  • B-树

  • SP GiST

“创建索引”的默认设置生成B树索引。PostgreSQL使用一个查询规划器来评估即将被索引的列,为其分配最合适的索引类型。

MySQL支持五种索引类型:

  • B-树

  • 唯一的

  • 全文

  • 降序

  • 主键

定义适当的索引类型可以提高MySQL中的数据检索性能。某些索引类型只能与某些数据类型一起使用。例如,全文仅适用于基于文本的列。

关系数据库中索引过多会降低MySQL数据库功能的性能,尤其是在删除、插入和更新查询方面。在MySQL中可以放置多种索引类型,但在何时这样做的问题上众说纷纭。MySQL还提供了查询解释工具,可以帮助诊断大型数据库上与索引相关的性能问题。

性能比较

评论和社区支持线程声称,PostgreSQL在处理复杂查询时,尤其是读/写过程和大型数据库时,速度更快,MySQL在只读操作方面更出色。

越少越好。来源:itnext.io

Petr Jahoda在2021的一篇文章(https://itnext.io/benchmark-databases-in-docker-mysql-postgresql-sql-server-7b129368eed7)中比较了包括PostgreSQL和MySQL在内的六种RDM的数据库性能。他的发现是,与MySQL中完成的相同数据库创建任务相比,PostgreSQL数据库性能显示:

  • 内存使用率降低86%

  • 初始CPU使用量减少95%

  • 数据库图像大小缩小70%

越少越好。来源:itnext.io

第二个测试创建了一个包含6列的表,并在其中插入了10000个数据行。重复插入五次以获得真实的结果。PostgreSQL大约需要100秒来完成所有五个数据行插入,而MySQL大约需要200秒。

第三个测试以阅读操作为中心。每个RDM的任务是每个循环执行两次读取,然后重复2000次。整个测试重复五次,共有10000个读取循环。PostgreSQL同样花费了MySQL一半的时间——84秒,而MySQL只花了168秒。

越少越好。来源:itnext.io

Petr指出,他在2019年进行了相同的数据库系统测试,结果几乎相同。当时,PostgreSQL是明显的赢家,MySQL的性能在所有参赛者中仅次于最差。

支持比较

当Evan讲述他与PostgreSQL的经历时,他的文章表现出一定程度的沮丧。Markus通过建议Evan和其他开发人员在使用PostgreSQL之前阅读其文档来解决这个问题。这不是一句刻薄的话,而是真正有建设性的反馈。

PostgreSQL以其清晰的示例、简洁的描述和高质量的写作,拥有迄今为止最易访问的文档。PostgreSQL有一个专用的wiki,其中“不要这样做”页面是高质量软件文档的主要示例。这种PostgreSQL支持弥补了粗略的社区支持。想要实现复杂查询的SQL外行将在PostgreSQL wiki上获得愉快的学习体验。

相比之下,软件工程师Rishabh Khanna在TrustRadius上为MySQL留下了一篇评论,他表示“他们应该处理文档。”在他看来,使用的字体会导致可读性问题。他称赞MySQL价格便宜,与大多数编程语言兼容,并且易于使用,因此获得了10/10的分数。

专业MySQL支持由MySQL订阅提供,具有五个核心元素:

  • 全天候支持

  • 知识库

  • 维护发行版

  • 无限支持事件

  • MySQL咨询支持

对单个MySQL功能的支持取决于购买的订阅计划。上面链接上的脚注表明,可以单独购买对非MySQL产品的支持。

存储引擎支持

根据MySQL 8.0参考手册,它支持9个存储引擎,默认为InnoDB:

  • CSV

  • 合并

  • InnoDB

  • 档案文件

  • MyISAM公司

  • 例子

  • 内存

  • 黑洞

  • 联邦

手册的一节指出第三方引擎也可以工作,但Oracle无法为其提供支持。MySQL用户可以创建和加载存储引擎,这得益于模块化架构,该架构允许在SQL(结构化查询语言)服务器运行时加载/卸载存储引擎。

同时,PostgreSQL本身没有存储引擎。第三方开发者正试图开发和推广一个存储引擎,使PostgreSQL达到MySQL的水平。一个这样的尝试被称为ZHEAP,其主要目的是减少由写放大引起的数据库问题。

安全性比较

安全性与可访问性呈负相关;完美安全的系统是一个任何人都无法访问的系统。开发人员必须在两者之间保持平衡,以防止最常见的攻击,同时节省时间和资源。PostgreSQL和MySQL有一套推荐的安全实践,以经济高效的方式防止网络攻击。

PostgreSQL手册建议:

  • 不信任任何用户

  • 最小化数据对用户开放的时间

  • 要求严格输入“以实现最大安全性”

当向用户授予权限时,应尽快对其进行限制,以便其他用户无法干预和劫持该过程。例如,如果授予与对象相关的权限,则可以在创建该对象的同一事务中撤销这些权限。

最常见的MySQL网络攻击是SQL注入。如果允许具有编程语言知识的用户查询MySQL数据库,例如从中检索数据,他们可能会找到一种方法来输入格式错误的查询,从而损坏数据库或使服务器崩溃。

MySQL参考手册安全指南部分建议清理用户输入以防止SQL注入。即使数据库仅包括公共的非敏感数据,也需要谨慎以防DDoS攻击。同样,对编程语言有细微了解的用户可能会破坏数据库或服务器。

结论

PostgreSQL在需要科学和伪科学数据处理和分析的环境中表现出明显的优势。如果项目需要关联非正统数据集、创建新的数据类型或处理复杂的查询,PostgreSQL是最合适的,可能也是唯一可行的RDM。

MySQL更适合于需要灵活实验和原型的环境。例如,Rishabh提到他在物联网项目中使用MySQL取得了巨大成功。然而,受限的数据类型使MySQL的应用范围受到限制。如果企业在预算紧张的情况下运营,相对较高的资源需求也使其成为扩大规模的糟糕选择。

在性能方面,PostgreSQL打败了MySQL,是最先进的数据库管理系统。然而,开发人员可能会错误地部署PostgreSQL,导致性能问题和数据库损坏。

**本文最初发表于Techreviewer:*PostgreSQL vs MySQL

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐