Postgres 与 MySQL

2025-06-10

Postgres 与 MySQL

大家好,我是 Brandon, Outerbase的首席执行官兼联合创始人,我们正在构建一个现代化的数据平台。我们每天与数千名开发人员合作管理他们的数据,我亲眼见证了 PostgreSQL 和 MySQL 如何脱颖而出,成为最受欢迎(且功能强大!)的两个数据库。在本文中,我将对两者进行比较,涵盖它们的优势、劣势以及细微的差异,以便您决定哪一款最适合您的需求。

几十年来,关系数据库为无数应用程序提供了强大的支持,并且仍然是许多现代系统的支柱。说到生产就绪型数据库,PostgreSQLMySQL是最广泛使用的。两者都提供了稳定的性能、可靠性和社区支持,但它们在数据处理方式、功能集和配置难易程度方面存在显著差异。了解这些细微差别可以帮助您根据特定需求选择合适的数据库。

TL;DR – 何时应该使用 PostgreSQL 或 MySQL?

下表概括了一些最大的差异:

标准 PostgreSQL MySQL
数据模型 高级(模式、自定义类型、JSON) 更简单(不同的数据库)
复杂查询 优秀(窗口函数、CTE) 功能足够,但高级功能较少
表现 擅长复杂写入和并发 在读取密集型工作负载方面表现出色
可扩展性 高度可扩展(自定义功能) 更有限,但生态系统庞大
许可 PostgreSQL 许可证(类似 BSD/MIT) Oracle 的 GPL + 商业许可证

功能概述

PostgreSQL
PostgreSQL 使用模式在单个数据库中组织数据,使团队能够对权限和逻辑数据分区进行细粒度的控制。它还支持多种数据类型,包括 JSON、数组、范围,甚至自定义类型,这对于处理复杂或半结构化数据的应用程序来说极具吸引力。该数据库使用多版本并发控制 (MVCC) 来减少锁争用,因此它通常擅长处理高负载写入和复杂查询,这些查询受益于窗口函数和通用表表达式 (CTE) 等功能。另一个关键优势是可扩展性:您可以添加自定义函数、运算符或扩展程序(例如用于地理空间数据的 PostGIS)——如果您的应用程序需要专门的功能,这将非常方便。

另一方面, MySQL 的
数据组织方式更简单,它使用不同的数据库而不是模式。这可以让小型项目或团队更轻松地通过简单地启动新数据库来保持数据隔离。MySQL 最大的卖点之一是它在读取密集型场景中的强大性能,尤其是在 InnoDB 引擎与适当的索引和缓存结合使用时。它还以简单的复制而闻名,许多高流量网站使用它将读取操作分布到多个服务器,并为全球用户提供更快的响应。MySQL 通常易于设置,并且拥有庞大的知识库,如果您需要快速启动项目,或者您的团队已经熟悉 MySQL 生态系统,那么这将非常有吸引力。

数据库详细信息

读/写吞吐量:
MySQL 通常在处理读取密集型工作负载方面表现出色,前提是索引和缓存层经过适当调整。一些大型用户(例如 Uber)发现,只要精心配置数据库,即使在高写入负载下也能成功使用 MySQL。对于简单的插入和更新操作,MySQL 在许多基准测试中可以与 PostgreSQL 匹敌。然而,PostgreSQL 通常在更复杂的写入和查询方面处于领先地位。其并发特性(由 MVCC 增强)减少了锁争用,并使其在同时涉及大量事务的场景中保持高性能。通过适当的调整,PostgreSQL 可以在典型的 OLTP 或分析工作负载中达到甚至超过 MySQL 的性能。

可扩展性:
两种数据库都具备良好的可扩展性,但实现方式不同。PostgreSQL 对垂直扩展反应良好——添加更多 CPU、RAM 或更快的存储通常会带来显著的收益。水平扩展则稍微复杂一些;像 PgBouncer 这样的用于连接池和逻辑复制的工具可以提供帮助,而像 Instagram 和 Notion 这样的大型平台已经证明它可以支持庞大的用户群。MySQL 长期以来一直因其简单的复制(主从)而备受赞誉,这使得卸载读取流量并将这些查询分布到多个服务器变得容易。这种内置的复制设置通常足以满足许多全局读取可扩展性至关重要的用例。

索引和查询优化
PostgreSQL 提供多种索引类型,例如 B 树、GiST、GIN 和 BRIN,它们适用于特定类型的查询,并可显著提升性能。它还具有复杂的 JSON 索引和全文搜索功能,但您可能需要启用某些扩展。MySQL 的 InnoDB 引擎主要依赖于 B 树索引,适用于大多数常见的查询模式,并且具有一定的全文索引功能,尽管不如 PostgreSQL 那样全面。

性能调优
PostgreSQL 和 MySQL 都需要调优参数(例如缓冲区大小、缓存、检查点间隔)来优化性能。PostgreSQL 可能比较复杂,尤其对于新用户而言。但只要索引和查询设计得当,这两种数据库都能在大多数生产环境中有效扩展。

近期趋势与认可
近年来,PostgreSQL 的受欢迎程度迅速提升,斩获“年度最佳数据库管理系统”等殊荣,并在开发者调查中取得长足进步。其宽松的许可证和现代化的功能集不断吸引着新用户。尽管如此,在 Oracle 的支持和庞大社区的推动下,MySQL 仍然是全球安装量最大的开源关系数据库。其稳定性、简洁性以及托管服务提供商和工具的生态系统,确保了它在诸多场景中持续占据主导地位。

许可证注意事项
MySQL 社区版采用 GPL 许可证,如果您希望保持代码的专有性,这可能会受到限制。在这种情况下,可能需要 Oracle 的商业许可证。PostgreSQL 的许可证类似于 BSD/MIT,限制较少,并且不要求披露源代码。

技术比较
PostgreSQL 的对象层次结构为“数据库 → 模式 → 表”,而 MySQL 采用的是“数据库 → 表”。PostgreSQL 完全符合 ACID 标准,可以处理 DML 和 DDL 事务;MySQL 也通过 InnoDB 引擎实现了 ACID 兼容,并在 8.0 及更高版本中支持原子 DDL。在安全性方面,PostgreSQL 提供开箱即用的行级安全性 (RLS),而 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 的 4-CPU 服务器上,PostgreSQL 的插入速度徘徊在每秒 19,000 次,而 MySQL 的插入速度则为每秒 10,000 次。
      • PostgreSQL 在第 99 个百分位显示出较低的延迟,并且更有效地利用了 CPU、磁盘和内存。
      • MySQL 性能下降了约 5,500 次查询/秒,导致 CPU 使用率更高。
  2. 选择(阅读)测试

    • 设置:查询涉及与约 7000 万行客户表连接的随机事件 ID。
    • 结果
      • PostgreSQL 再次显示出较低的延迟,可以顺利扩展到约 32,000 个查询/秒。
      • MySQL 开始显示接近每秒 18,000 次查询的延迟峰值,这与 CPU 使用率上升有关。
      • 两者最终都达到了 CPU 饱和,但 PostgreSQL 在遇到瓶颈之前还能继续运行。

关键要点

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

实际性能会因硬件、索引策略、查询模式和配置而异。在做出最终选择之前,请务必在反映生产设置的环境中进行测试。

为了简化 Postgres 和 MySQL 的测试和使用,Outerbase 提供了强大的界面,用于探索、查询和可视化数据库。无论您是比较基准测试还是管理生产工作负载,Outerbase都能帮助您简化流程。


Postgres 和 MySQL 哪个更好?

  • 如果考虑 PostgreSQL

    • 您需要高级功能,例如窗口函数、CTE、自定义数据类型或用于地理空间查询的 PostGIS。
    • 您预期会有复杂或高度并发的工作负载。
    • 您需要一个更宽松、限制更少的许可证。
    • 您渴望融入快速扩张的生态系统和社区。
  • 如果考虑 MySQL

    • 您主要关注的是具有简单查询的读取繁重的工作负载。
    • 您需要某种能够快速、简单地部署,并由大量知识库支持的东西。
    • 您的团队已经了解 MySQL,或者您的托管环境已针对它进行了优化。
    • 您更喜欢轻松复制以实现水平扩展。

最好的方法通常是同时测试两者。启动几个实例,复制实际工作负载,并查看每个数据库的性能。您可能会发现,某个数据库天生就更适合您的数据和查询模式,尤其是在考虑到您的团队对每种技术的熟悉程度之后。


结论

如果您需要窗口函数、CTE、自定义数据类型等高级功能,或者需要 PostGIS 进行地理空间工作,那么 PostgreSQL 或许是您的理想之选。它在处理高并发性或复杂工作负载方面也表现出色,而且其宽松的许可证不会对您自己的代码施加太多限制。同时,如果您的应用程序读取操作繁重,并且您希望快速部署,那么 MySQL 仍然是一个不错的选择,尤其是在您的团队已经熟悉 MySQL 或您的环境已针对 MySQL 进行优化的情况下。其更简单的复制机制对于需要扩展读取的用户来说非常方便。

最终,最佳方法是在与生产环境相同的环境中测试这两个数据库。检查它们在实际数据、查询和并发级别下的性能表现。“更好”的选择通常取决于功能需求、工作负载配置、操作熟悉程度、许可和长期可扩展性目标等因素。虽然 PostgreSQL 的功能集正在吸引快速增长的用户群,但 MySQL 的良好记录和庞大的社区确保它在未来几年仍将是主流。

如果您需要一种简单的方法来测试 Postgres 和 MySQL,请查看我们的开源 repo Outerbase Studio,它使您能够查看、编辑、查询甚至部署它们。


感谢您的阅读!如果您有任何其他建议或想查看更多指标,请随时联系我们。

向 Anton P 致谢,感谢他的基准测试

鏂囩珷鏉ユ簮锛�https://dev.to/outerbase/postgres-vs-mysql-14cp
PREV
JVM 架构 101:了解虚拟机
NEXT
Google Chrome 的新更新终于允许您组织和分组标签!