为了账号安全,请及时绑定邮箱和手机立即绑定

Postgres和MySQL哪个更适合你?

标签:
MySQL 数据库

关系型数据库几十年来一直支持着无数应用程序,仍然是许多现代系统的重要支柱。在准备投入生产的选项方面,有两个最广泛使用的选项,PostgreSQLMySQL。两者都提供了可靠的性能、稳定性和社区支持,但在处理数据的方式和特点、功能集以及配置的难易程度和方式上存在明显差异。了解这些差异可以帮助您根据具体需求选择合适的数据库。

简而言之,什么时候应该使用PostgreSQL或MySQL?

下表简要列出了最大的差异:

标准 PostgreSQL MySQL
数据模型 高级(模式,自定义类型,JSON) 单独的数据库
复杂查询 卓越(窗口函数,CTE) 良好,但高级功能较少
性能 在复杂写入和高并发场景中表现优异 读取负载高的工作负载性能强
扩展性 高度可扩展(自定义函数) 扩展性稍弱,但生态系统庞大
许可证 PostgreSQL许可证(类似BSD/MIT) GPL加上由Oracle提供的商业许可

功能简介

PostgreSQL
PostgreSQL 使用模式来组织单个数据库中的数据,为团队提供了对权限和逻辑数据分割的精细控制。它还支持广泛的数据类型,包括 JSON、数组、范围,甚至用户定义的数据类型,因此,它非常适合处理复杂或半结构化数据的应用程序。该数据库使用多版本并发控制(MVCC)来减少锁的竞争,因此它通常在处理大量写入负载和复杂的查询时表现出色,这些查询可以利用这些功能,如窗口函数和公用表表达式(CTEs)。另一个关键优势在于其可扩展性:您可以添加自定义函数、操作符或扩展,例如用于地理空间数据的 PostGIS 扩展——如果您的应用程序需要特殊功能,这将非常有用。

MySQL
相比之下,MySQL以更简单的方式来组织数据,使用独立的数据库而非模式。这可以为较小的项目或团队提供便利,他们可以通过启动一个新的数据库来简单地保持数据的隔离。MySQL的一大优势是在读密集型场景中表现出色,特别是在使用InnoDB引擎并适当索引和缓存时。它还因为其简单的复制功能而闻名,许多高流量网站利用这一功能将读取操作分散到多个服务器,从而为全球用户提供更快的响应时间。MySQL通常非常易于设置,并拥有庞大的知识库,这对快速启动项目或团队熟悉MySQL生态系统的情况非常有吸引力。

数据库信息

读写吞吐量
MySQL 在处理读密集型工作负载方面通常表现出色,前提是索引和缓存层已经调优且配置得当。一些大规模应用,例如 Uber,发现 MySQL 在处理大量写负载时也能表现良好,前提是数据库经过仔细配置。在这些操作中,MySQL 在许多基准测试中可以与 PostgreSQL 匹敌。然而,PostgreSQL 在更复杂的写入和复杂查询方面通常表现更佳。其并发功能通过 MVCC 得到增强,减少了锁竞争,并使其在涉及大量并发事务的情况下能够在保持高性能。在适当调整后,PostgreSQL 在典型的 OLTP 或分析工作负载中可以达到甚至超过 MySQL 的性能。

可扩展性
这两个数据库都具有良好的可扩展性,但它们实现的方式有所不同。PostgreSQL 对垂直扩展(增加更多的 CPU、内存或更快的存储)有很好的响应,通常会带来显著的性能提升。水平扩展则稍微复杂一点;使用像 PgBouncer 这样的连接池工具可以有所帮助,大型平台如 Instagram 和 Notion 已经证明它可以支持庞大的用户群体。MySQL 由于其简单的复制机制(主-从复制)长期以来一直被称赞,这使得它很容易分散读取请求。这种内置的复制设置对于许多需要全球读取扩展的应用场景已经足够。

索引和查询优化
PostgreSQL 提供了多种索引类型,如 B-tree、GiST、GIN 和 BRIN,适用于特定类型的查询,从而显著提高性能。它还具有强大的 JSON 索引功能和全文搜索能力,但你可能需要启用一些扩展。MySQL 的 InnoDB 引擎主要依赖于 B-tree 索引,适合大多数常见查询模式,并且它也有一些全文搜索功能——虽然没有 PostgreSQL 那么全面的功能。

性能调优
不论是PostgreSQL还是MySQL,都需要调优参数(例如,缓冲区大小(buffer size)、缓存、检查点间隔)来优化性能。PostgreSQL的调优可能更为复杂,尤其是对于新手来说,但通过设计良好的索引和查询,任何数据库在大多数生产环境中都能有效扩展。

近期趋势与认可
近年来,PostgreSQL 的受欢迎程度迅速上升,赢得了诸如年度最佳数据库管理系统之类的赞誉,并在开发者调查中表现优异。其宽松的许可证和现代功能集仍持续吸引新用户。然而,MySQL 仍然是全球最常安装的开源关系型数据库,得益于 Oracle 的支持以及庞大的用户社区。其稳定性和简洁性,以及丰富的托管服务提供商和工具生态系统,确保了其在众多场景中的持续领先地位。

许可证考虑
MySQL的社区版使用GPL许可,如果你希望保持自己的代码专有,这可能会带来很多限制。在这种情况下,你可能需要购买Oracle的商业许可。PostgreSQL的许可类似于BSD或MIT许可,限制较少,并且不需要披露你的源代码。

技术对比
PostgreSQL 的对象层次结构为数据库 → 模式 → 表,而 MySQL 则为数据库 → 表。PostgreSQL 完全符合 ACID 规范,可以处理 DML 和 DDL 事务;MySQL 通过 InnoDB 引擎也符合 ACID 规范,并从 8.0 版本开始支持原子 DDL。在安全性方面,PostgreSQL 提供了默认的行级安全功能,而 MySQL 则需要通过视图或存储过程等变通手段来实现类似的功能。

在复制方面,PostgreSQL 支持物理(基于WAL)和逻辑(发布/订阅)方法。MySQL 使用二进制日志来实现逻辑复制,并且通常配置为使用主从复制进行读扩展。PostgreSQL 在 JSON 处理方面更全面,得益于其强大的索引和丰富的函数集。虽然 MySQL 在版本 8.0+ 中提供了 JSON 支持,但其对 JSON 数据的索引支持有限。PostgreSQL 的窗口函数和 CTE 更为成熟,尽管 MySQL 最近也通过添加这些功能来赶上。如果你重视可扩展性,PostgreSQL 提供了广泛的扩展——如 PostGIS 用于地理空间用例,pg_stat_statements 用于详细的查询洞察,并支持定义自定义数据类型——而 MySQL 的定制功能主要集中在存储过程和插件上。

……

Postgres 和 MySQL 的磁盘使用对比

Postgres 和 MySQL 性能比拼:

在进行测试时,我们使用了配置类似的 Go 客户端。

  1. 编写测试
  • 设置:多个虚拟客户端持续插入随机生成的记录。

  • 结果

  • 在一台配备SSD的四核CPU服务器上,PostgreSQL的插入速率约为19,000次/秒,而MySQL则为10,000次/秒。

  • 在第99个百分位时,PostgreSQL的延迟较低,并且在CPU、磁盘和内存的使用上更为高效。

  • MySQL的性能下降至约5,500次查询/秒,导致更高的CPU使用。

    1. 读取测试
  • 环境设置:查询涉及一个随机事件ID与大约7000万行的客户表连接。
  • 结果

  • PostgreSQL再次表现出较低的延迟,并且可以很好地扩展到每秒约32,000次查询。

  • 当接近每秒18,000次查询时,MySQL开始显示出延迟峰值,这与CPU使用率的上升有关。

  • 最终两者都达到了CPU饱和状态,但PostgreSQL在达到极限之前扩展得更远一些。

要点

  • 写入效率:PostgreSQL 在处理大量插入负载时使用了更少的资源。
  • 读取性能:MySQL 在初期表现良好,但在高并发情况下,性能下降得更快。
  • 资源利用率:PostgreSQL 在同等负载下通常使用了更少的系统资源。

实际性能会因为硬件、索引策略、查询模式和配置的不同而有所变化。在做出最终选择之前,最好是在一个能真实反映生产环境的环境中进行测试,这样更容易理解。

为了简化对 Postgres 和 MySQL 的测试和使用,Outerbase 提供了一个强大的界面,用于查看、查询和可视化您的数据库。不论是对比基准测试还是管理实际工作负载,Outerbase,这个工具,都可以帮助您简化操作流程。Outerbase,这个工具,可以帮助您简化操作流程。

此处省略部分内容

那么,Postgres 和 MySQL 哪个更棒?你觉得
  • 如果你在考虑使用 PostgreSQL

  • 你需要高级功能,如窗口函数、CTE(Common Table Expression)、自定义数据类型或PostGIS用于地理空间查询。
  • 你期望复杂的或高度并发的工作负载。
  • 你想要一个许可更宽松、限制更少的数据库。
  • 你希望利用一个快速扩展的生态系统和社区。
    如果考虑使用MySQL

  • 你的主要重点是读取量大的工作负载,有简单的查询需求。
  • 你想要一个快速简单且容易部署的系统,有庞大的知识库支持。
  • 你的团队已经熟悉 MySQL,或者托管环境已经为 MySQL 优化过。
  • 你更倾向于易于复制以实现水平扩展。

最好的方法通常是同时测试两者。部署几个实例,复制你的实际工作量,看看它们的表现如何。你可能会发现其中一个数据库更适合你的数据和查询模式,尤其是考虑到团队对这些技术的熟悉程度时。


结尾

你更倾向于使用 PostgreSQL,如果你需要高级功能,如窗口函数、CTE、自定义数据类型或 PostGIS 处理地理空间数据。它在处理更重的并发或复杂工作负载时同样表现出色,并且其宽松的许可证不会对你自己的代码施加太多限制。与此同时,如果你的应用程序偏向于读取密集型,并且你希望快速部署,并且你的团队已经熟悉 MySQL 或你的环境已经为此进行了优化处理,那么 MySQL 仍然是一个有吸引力的选择。对于那些需要扩展读取能力的用户,其简单的复制机制使其非常适合扩展读取。

最终,最好的方法是在一个与您的生产环境相匹配的环境中测试这两个数据库。检查它们在处理实际数据、执行查询和管理并发水平方面的表现。更好的选择通常取决于诸如功能需求、工作负载特征、运营熟悉度、许可和长期可扩展性目标等因素。虽然 PostgreSQL 的功能集正在吸引越来越多的用户,但 MySQL 已经被验证的性能和庞大的社区支持确保它在未来数年内仍将是主流选择。

如果你需要一个简单的方法来测试Postgres和MySQL,不妨试试我们的开源项目Outerbase Studio,它支持查看、编辑、查询甚至部署这两个数据库。


感谢阅读! 有任何更多建议或想看更多指标的话,欢迎随时联系哦。

特别感谢安东 P 的基准测试

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消