PostgreSQL vs MySQL——哪种关系数据库更好?
PostgreSQL和MySQL是世界上最流行的两种关系数据库管理系统(RDMS)。包括商业企业和开源基金会在内的所有市场人口都在使用它们。它们的共同点是强大的网络容错能力和对数据聚类的支持。这篇文章的主题是将它们区分开来。 RDMS起源和历史 1973年,加州大学伯克利分校启动了一个名为“Ingres”的项目,为关系数据库管理系统制定新标准。该项目是用C编写的,并根据开源许可证向公众发布。根据
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
更多推荐
所有评论(0)