Postgres与MySQL比较


在 Postgres 和 MySQL 之间进行选择很困难,并且经常引起激烈的争论

Postgres 具有更多功能、更繁荣的社区和生态系统。而MySQL有更容易的学习曲线和更大的用户群。

 Postgres 越来越受到开发人员的欢迎。但从运维经验来看,Postgres的复杂性确实牺牲了一些便利性。

如果您不熟悉 Postgres,我们建议您从云提供商处启动一个实例,运行几个查询来感受一下。有时,这些额外的东西并不值得,MySQL 会是一个更简单的选择。

运维性

  • 由于底层存储引擎的设计,Postgres 在重负载下存在臭名昭著的XID 环绕问题
  • 对于 MySQL,我们在 Google Cloud 上运行庞大的 MySQL 队列时遇到了一些复制错误。

这些问题仅在极端负载时发生。对于正常工作负载,Postgres 和 MySQL 都成熟可靠。数据库托管平台还提供集成的备份/恢复、监控。

连接方式

  • Postgres 使用每个连接进程,其中每个连接都会生成一个新进程。
  • MySQL 对每个连接使用线程,每个连接生成一个新线程。

因此,Postgres 提供了更好的隔离,例如无效的内存访问错误只会导致单个进程崩溃,而不是整个数据库服务器崩溃。
这种进程模型会消耗更多资源。

因此,对于 Postgres 生产部署,建议通过连接池程序(例如PgBouncerpgcat )代理连接。

可用性
Postgres 更严格,而 MySQL 更宽容:

  • MySQL 允许在使用 GROUP BY 子句的 SELECT 中包含非聚合列。Postgres 没有。
  • MySQL 默认情况下不区分大小写。Postgres 默认区分大小写。

MySQL 允许连接来自不同数据库的表。
Postgres 只能连接单个数据库内的表,除非使用 FDW 扩展。

可扩展性

  • Postgres 支持扩展。最出色的是PostGIS,它为 Postgres 带来了地理空间功能。此外,还有外部数据包装器(FDW)允许查询其他数据系统,pg_stat_statements 跟踪计划和执行统计数据,甚至 pgvector 为人工智能应用程序执行向量搜索。
  • MySQL拥有可插拔的存储引擎架构并催生了InnoDB。但如今,InnoDB 已经成为 MySQL 中占主导地位的存储引擎,因此可插拔架构只是作为 API 边界,而不是用于扩展目的。

对于身份验证,Postgres 和 MySQL 都支持可插入身份验证模块 (PAM)。

窗口函数
窗口框架类型:MySQL仅支持ROWS框架类型,它允许您定义由固定行数组成的框架。另一方面,Postgres 支持 ROWS 和 RANGE 帧类型。

范围单位:MySQL 仅支持 UNBOUNDED PRECEDING 和 CURRENT ROW 范围单位,而 Postgres 支持更多范围单位,包括 UNBOUNDED FOLLOWING 和 BETWEEN。

性能:一般来说,Postgres 的窗口函数实现被认为比 MySQL 实现更高效、更高性能。

高级函数:Postgres 支持更高级的窗口函数,例如 LAG()、LEAD()、FIRST_VALUE() 和 LAST_VALUE()。

CTE(通用表表达式)
Postgres对CTE有更全面的支持:

  • CTE 内的选择、更新、插入、删除。
  • CTE 之后的 SELECT、UPDATE、INSERT、DELETE。

MySQL 支持:
  • CTE 内的 SELECT。
  • CTE 之后的 SELECT、UPDATE 和 DELETE。

JSON
Postgres 和 MySQL 都支持 JSON 列。Postgres 支持更多功能:

  • 更多操作符可访问 JSON 功能。
  • 允许在 JSON 字段上创建索引。

复制
对于 Postgres,标准复制是使用 WAL 的物理复制。对于MySQL来说,标准复制是使用binlog的逻辑复制。
Postgres 还通过其发布/订阅模式支持逻辑复制。

查询优化器
Postgres 有更好的查询优化器。

安全
Postgres 和 MySQL 都支持 RBAC。
Postgres 支持开箱即用的附加行级安全性 (RLS),而 MySQL 需要创建额外的视图来模拟此行为。

ACID事务
两个数据库都提供 ACID 事务。总体而言,Postgres提供了更强的事务支持。

性能
对于大多数工作负载,Postgres 和 MySQL 的性能相当,最多相差 30%。
另一方面,无论您选择哪个数据库,如果您的查询没有使用索引,则性能可能会下降 10 倍到 1000 倍。

在极端写入密集型工作负载方面,MySQL 确实比 Postgres 有优势。

除非你的业务达到 Uber 级别的规模,否则单纯的数据库性能并不是决定性因素。Instagram 和 Notion 等公司也能以超大规模使用 Postgres。

License

  • MySQL 社区版根据 GPL 获得许可。
  • Postgres 是在 PostgreSQL 许可证下发布的,这是一个类似于 BSD 或 MIT 许可证的自由开源许可证。

尽管MySQL采用GPL,但有些人仍然担心MySQL归Oracle所有。这也是 MariaDB 从 MySQL 分叉出来的原因。