Postgres与MySQL对比
Anton P 的[基准测试]
MySQL与PostgreSQL性能基准(延迟-吞吐量-饱和)
我们每天与成千上万的开发人员合作管理他们的数据,我亲眼目睹了 PostgreSQL 和 MySQL 如何成为最受欢迎(也是最强大)的两个数据库。在本文中,我将比较两者 — 涵盖它们的优点、缺点和细微差别 — 以便您可以决定哪一个最适合您的需求。
几十年来,关系数据库为无数应用程序提供支持,它们仍然是许多现代系统的支柱。当谈到生产就绪选项时,有两个选项是使用最广泛的,即 PostgreSQL 和 **MySQL。**两者都提供可靠的性能、可靠性和社区支持,但它们在处理数据的方式、功能集和配置的难易程度方面存在显著差异。了解这些细微差别可以帮助您选择适合您特定需求的产品。
何时应该使用 PostgreSQL 或 MySQL?
下表总结了一些最大的差异,一目了然:
标准 | PostgreSQL 数据库 | MySQL (MySQL的 |
---|---|---|
数据模型 | 高级(架构、自定义类型、JSON) | 更简单(不同的数据库) |
复杂查询 | 优秀(窗口功能、CTE) | 足够,但高级功能较少 |
性能 | 擅长复杂写入、并发性 | 擅长读取密集型工作负载 |
扩展 | 高度可扩展(自定义函数) | 更有限但庞大的生态系统 |
发 牌 | PostgreSQL 许可证(类似 BSD/MIT) | GPL + Oracle 商业许可证 |
功能概述
PostgreSQL 数据库
PostgreSQL 使用架构在单个数据库中组织数据,使团队能够对权限和逻辑数据分区进行精细控制。它还支持多种数据类型,包括 JSON、数组、范围,甚至自定义类型,使其对处理复杂或半结构化数据的应用程序具有吸引力。该数据库使用多版本并发控制 (MVCC) 来减少锁争用,因此它通常在繁重的写入负载和复杂查询方面表现出色,这些查询受益于窗口函数和公用表表达式 (CTE) 等功能。另一个关键优势是可扩展性:您可以为地理空间数据添加自定义函数、运算符或扩展(如 PostGIS),如果您的应用程序需要专门的功能,这非常方便。
MySQL (MySQL的
另一方面,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 迅速普及,赢得了年度 DBMS 等荣誉,并在开发人员调查中取得了长足的进步。其宽松的许可证和现代功能集继续吸引新用户。尽管如此,在 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) 和逻辑 (pub/sub) 方法。MySQL 使用二进制日志来促进逻辑复制,并且通常配置为使用主副本设置进行读取扩展。JSON 处理在 PostgreSQL 中更加全面,这要归功于其强大的索引和函数数组。虽然 MySQL 在 8.0+ 版中也包含 JSON 功能,但它对 JSON 数据的索引在一定程度上受到限制。PostgreSQL 的窗口函数和 CTE 更加成熟,尽管 MySQL 最近通过添加这些功能来迎头赶上。如果您重视可扩展性,PostgreSQL 提供了广泛的扩展 — 用于地理空间用例的 PostGIS、用于详细查询见解的 pg_stat_statements 以及定义自定义数据类型的能力 — 而 MySQL 的自定义选项则侧重于存储过程和插件。
Postgres 与 MySQL 性能
在使用具有类似配置的 Go 客户端的测试中:
- Insert (Write) 测试
- **设置**:多个虚拟客户端连续插入随机记录。
- **结果**:
- PostgreSQL 在配备 SSD 的 4 CPU 服务器上徘徊在 19000 次插入/秒左右,而 MySQL 为 10000 次。
- PostgreSQL 在第 99 个百分位的延迟较低,并且更有效地使用 CPU、磁盘和内存。
- MySQL 性能下降了大约 5500 个查询/秒,从而导致更高的 CPU 使用率。
- 选择(读取)测试
- **设置**:查询涉及针对 ~7000 万行 customer 表联接的随机事件 ID。
- **结果**:
- PostgreSQL 再次显示出更低的延迟,很好地扩展到 ~32000 个查询/秒。
- MySQL 开始出现接近 18000 个查询/秒的延迟峰值,这与 CPU 使用率上升有关。
- 两者都最终达到了 CPU 饱和,但 PostgreSQL 在碰壁之前进一步延伸。
关键要点
- 写入效率:PostgreSQL 以较少的资源使用量处理繁重的插入负载。
- 读取性能:MySQL 最初表现良好,但在高并发下下降得更快。
- 资源利用率:PostgreSQL 通常在同等负载下使用较少的系统资源。
实际性能会因硬件、索引策略、查询模式和配置而异。在做出最终选择之前,请始终在反映您的生产设置的环境中进行测试。
为了简化 Postgres 和 MySQL 的测试和使用,Outerbase 提供了一个强大的界面来探索、查询和可视化您的数据库。无论您是比较基准还是管理生产工作负载,Outerbase 都可以帮助您简化流程。
所以,Postgres 与 MySQL 哪个更好
-
**如果**
- 您需要高级功能,例如窗口函数、CTE、自定义数据类型或用于地理空间查询的 PostGIS。
- 您期望工作负载复杂或高度并发。
- 您需要一个更宽松、限制更少的许可证。
- 您渴望进入快速扩展的生态系统和社区。
-
**如果 MySQL**
- 您的主要关注点是具有简单查询的读取密集型工作负载。
- 您希望以庞大的知识库为后盾,快速简单地部署。
- 您的团队已经了解 MySQL,或者您的托管环境已针对 MySQL 进行了优化。
- 您更喜欢轻松复制以进行水平扩展。
最好的方法通常是同时测试两者。启动几个实例,复制您的实际工作负载,并查看每个实例的执行情况。您可能会发现一个数据库自然更适合您的数据和查询模式,尤其是当您考虑到您的团队对每种技术的适应程度时。
结论
如果您需要高级功能(如窗口函数、CTE、自定义数据类型或用于地理空间工作的 PostGIS),您可能会喜欢 PostgreSQL。它还擅长处理较重的并发或复杂的工作负载,并且其宽松的许可证不会对您自己的代码施加太多限制。同时,如果您的应用程序读取量很大,并且您希望快速部署某些内容,特别是如果您的团队已经熟悉 MySQL 或您的环境已针对 MySQL 进行了优化,那么 MySQL 仍然是一个令人信服的选择。其更简单的复制机制对于需要扩展读取的用户来说非常方便。
最后,最好的方法是在镜像您的生产设置的环境中测试这两个数据库。检查它们如何处理您的实际数据、查询和并发级别。“更好”选项通常归结为功能要求、工作负载配置文件、操作熟悉度、许可和长期可扩展性目标等因素。虽然 PostgreSQL 的功能集吸引了快速增长的用户群,但 MySQL 的良好记录和庞大的社区确保它在未来几年仍将是支柱。