乐趣区

关于数据库:全方位对比-Postgres-和-MySQL-2023-版

依据 2023 年 Stack Overflow 调研,Postgres 曾经取代 MySQL 成为最受敬佩和渴望的数据库。

随着 Postgres 的发展势头愈发强劲,在 Postgres 和 MySQL 之间做抉择变得更难了。

如果看装置数量,MySQL 可能仍是寰球最大的开源数据库。

Postgres 则自夸为寰球最先进的开源关系型数据库。

因为须要与各种数据库及其衍生产品集成,Bytebase 和各种数据库密切合作,而托管 MySQL 和 Postgres 最大的云服务之一 Google Cloud SQL 也是 Bytebase 创始人的杰作之一。

咱们对 Postgres 和 MySQL 在以下几个维度进行了比拟:

  • 许可证 License
  • 性能 Performance
  • 性能 Features
  • 可扩展性 Extensibility
  • 易用性 Usability
  • 连贯模型 Connection Model
  • 生态 Ecosystem
  • 可运维性 Operability

除非另有阐明,下文基于最新的次要版本 Postgres 15 和 MySQL 8.0 (应用 InnoDB)。在文章中,咱们应用 Postgres 而不是 PostgreSQL,只管 PostgreSQL 才是官网名称,但被认为是一个谬误的决定。

许可证 License

  • MySQL 社区版采纳 GPL 许可证。
  • Postgres 公布在 PostgreSQL 许可下,是一种相似于 BSD 或 MIT 的自在开源许可。

即使 MySQL 采纳了 GPL,仍有人放心 MySQL 归 Oracle 所有,这也是为什么 MariaDB 从 MySQL 分叉进去。

性能 Performance

对于大多数工作负载来说,Postgres 和 MySQL 的性能相当,最多只有 30% 的差别。无论抉择哪个数据库,如果查问短少索引,则可能导致 x10 ~ x1000 的降级。
话虽如此,在极其的写入密集型工作负载方面,MySQL 的确比 Postgres 更具劣势。能够参考下文理解更多:

  • 为什么 Uber 从 Postgres 迁徙到 MySQL
  • 咱们最厌恶的 PostgreSQL 局部

除非你的业务达到了 Uber 的规模,否则纯正的数据库性能不是决定因素。像 Instagram, Notion 这样的公司也可能在超大规模下应用 Postgres。

性能 Features

对象层次结构

MySQL 采纳了 4 级构造:

  1. 实例
  2. 数据库

Postgres 采纳了 5 级构造:

  • 实例(也称为集群)
  • 数据库
  • 模式 Schema

ACID 事务

两个数据库都反对 ACID 事务,Postgres 提供更弱小的事务反对。

安全性

Postgres 和 MySQL 都反对 RBAC。

Postgres 反对开箱即用的附加行级平安 (RLS),而 MySQL 须要创立额定的视图来模仿此行为。

查问优化器

Postgres 的查问优化器更优良,详情参考此吐槽。

复制

Postgres 的规范复制应用 WAL 进行物理复制。MySQL 的规范复制应用 binlog 进行逻辑复制。

Postgres 也反对通过其公布 / 订阅模式进行逻辑复制。

JSON

Postgres 和 MySQL 都反对 JSON。Postgres 反对的性能更多:

  • 更多操作符来拜访 JSON 性能。
  • 容许在 JSON 字段上创立索引。

CTE (Common Table Expression)

Postgres 对 CTE 的反对更全面:

  • 在 CTE 内进行 SELECT, UPDATE, INSERT, DELETE 操作
  • 在 CTE 之后进行 SELECT, UPDATE, INSERT, DELETE 操作

MySQL 反对:

  • 在 CTE 内进行 SELECT 操作
  • 在 CTE 之后进行 SELECT, UPDATE, DELETE 操作

窗口函数 (Window Functions)

窗口帧类型:MySQL 仅反对 Row Frame 类型,容许定义由固定数量行组成的帧;而 Postgres 同时反对 Row Frame 和范畴帧类型。

范畴单位:MySQL 仅反对 UNBOUNDED PRECEDING 和 CURRENT ROW 这两种范畴单位;而 Postgres 反对更多范畴单位,包含 UNBOUNDED FOLLOWING 和 BETWEEN 等。

性能:一般来说,Postgres 实现的 Window Functions 比 MySQL 实现更高效且性能更好。

高级函数:Postgres 还反对更多高级 Window Functions,例如 LAG(), LEAD(), FIRST_VALUE(), and LAST_VALUE()。

可扩展性 Extensibility

Postgres 反对多种扩大。最出色的是 PostGIS,它为 Postgres 带来了天文空间能力。此外,还有 Foreign Data Wrapper (FDW),反对查问其余数据系统,pg_stat_statements 用于跟踪布局和执行统计信息,pgvector 用于进行 AI 利用的向量搜寻。

MySQL 具备可插拔的存储引擎架构,并诞生了 InnoDB。但现在,在 MySQL 中,InnoDB 已成为主导存储引擎,因而可插拔架构只作为 API 边界应用,而不是用于扩大目标。

在认证方面,Postgres 和 MySQL 都反对可插拔认证模块 (PAM)。

易用性 Usability

Postgres 更加严格,而 MySQL 更加宽容:

  • MySQL 容许在应用 GROUP BY 子句的 SELECT 语句中蕴含非聚合列;而 Postgres 则不容许。
  • MySQL 默认状况下是大小写不敏感的;而 Postgres 默认状况下是大小写敏感的。
  • MySQL 容许 JOIN 来自不同数据库的表;而 Postgres 只能连贯单个数据库外部的表,除非应用 FDW 扩大。

连贯模型 Connection Model

Postgres 采纳在每个连贯上生成一个新过程的形式工作。而 MySQL 则在每个连贯上生成一个新线程。因而,Postgres 提供了更好的隔离性,例如,一个有效的内存拜访谬误只会导致单个过程解体,而不是整个数据库服务器。另一方面,过程模型耗费更多资源。因而,在部署 Postgres 时倡议通过连接池(如 PgBouncer 或 pgcat)代理连贯。

生态 Ecosystem

常见的 SQL 工具都能很好地反对 Postgres 和 MySQL。因为 Postgres 的可扩大架构,并且仍被社区领有,近年来 Postgres 生态系统更加凋敝。对于提供托管数据库服务的利用平台,每个都抉择了 Postgres。从晚期的 Heroku 到更新的 Supabase, render 和 Fly.io。

可运维性 Operability

因为底层存储引擎设计问题,在高负载下,Postgres 存在臭名远扬的 XID wraparound 问题。

对于 MySQL,在 Google Cloud 经营大规模 MySQL 集群时,咱们遇到过一些复制谬误。

这些问题只会在极其负载下产生。对于失常工作负载而言,无论是 Postgres 还是 MySQL 都是成熟且牢靠的。数据库托管平台也提供集成备份 / 复原和监控性能。

Postgres 还是 MySQL

2023 年了,在 Postgres 和 MySQL 之间做抉择依然很艰难,并且常常引起强烈探讨。

总的来说,Postgres 有更多功能、更凋敝的社区和生态;而 MySQL 则更易学习并且领有宏大的用户群体。

咱们察看到与 Stack Overflow 后果雷同的行业趋势,即 Postgres 在开发者中变得越来越受欢迎。但依据咱们的理论体验,精细的 Postgres 就义了一些便利性。如果你对 Postgres 不太熟悉,最好从云服务提供商那里启动一个实例,并运行几个查问来上手。有时候,这些额定益处可能并不值得,抉择 MySQL 会更容易一些。

同时,在一个组织外部共存 Postgres 和 MySQL 也是很常见的状况。如果须要同时治理 Postgres 和 MySQL 的开发生命周期,能够来理解一下 Bytebase。


💡 你能够拜访官网:https://www.bytebase.com/,收费注册云账号,立刻体验 Bytebase。

退出移动版