天天看點

全方位對比 Postgres 和 MySQL(2023 版)

作者:dbaplus社群

根據 2023 年的 Stack Overflow 調研(https://survey.stackoverflow.co/2023/) ,Postgres 已經取代 MySQL 成為最受敬仰和渴望 (the most admired, desired) 的資料庫。

全方位對比 Postgres 和 MySQL(2023 版)

随着 Postgres 的發展勢頭愈發強勁,在 Postgres 和 MySQL 之間做選擇變得更難了。

如果看安裝數量,MySQL 可能仍是全球最大的開源資料庫。

全方位對比 Postgres 和 MySQL(2023 版)

Postgres 則自诩為全球最先進的開源關系型資料庫。

全方位對比 Postgres 和 MySQL(2023 版)

因為需要與各種資料庫及其衍生産品內建,Bytebase 和各種資料庫密切合作,而托管 MySQL 和 Postgres 最大的雲服務之一 Google Cloud SQL (https://cloud.google.com/sql) 也是 Bytebase 創始人的傑作之一。

本文中,我們對 Postgres 和 MySQL 在以下幾個次元進行了比較:

  • 許可證 License
  • 性能 Performance
  • 功能 Features
  • 可擴充性 Extensibility
  • 易用性 Usability
  • 連接配接模型 Connection Model
  • 生态 Ecosystem
  • 可運維性 Operability

除非另有說明,下文基于最新的主要版本 Postgres 15 和 MySQL 8.0 (使用 InnoDB)。在文章中,我們使用 Postgres 而不是 PostgreSQL (可以說是搬起石頭砸自己的腳),盡管 PostgreSQL 才是官方名稱,但被認為是一個錯誤的決定 (https://www.craigkerstiens.com/2018/10/30/postgres-biggest-mistake/)。

全方位對比 Postgres 和 MySQL(2023 版)

一、許可證 License

  • MySQL 社群版采用 GPL 許可證。
  • Postgres 釋出在 PostgreSQL 許可下,是一種類似于 BSD 或 MIT 的自由開源許可。

即便 MySQL 采用了 GPL,仍有人擔心 MySQL 歸 Oracle 所有,這也是為什麼 MariaDB 從 MySQL 分叉出來。

二、性能 Performance

對于大多數工作負載來說,Postgres 和 MySQL 的性能相當,最多隻有 30% 的差異。無論選擇哪個資料庫,如果查詢缺少索引,則可能導緻 x10 ~ x1000 的降級。

話雖如此,在極端的寫入密集型工作負載方面,MySQL 确實比 Postgres 更具優勢。可以參考下文了解更多:

  • 為什麼 Uber 從 Postgres 遷移到 MySQL: https://www.uber.com/en-SG/blog/postgres-to-mysql-migration/
  • 我們最讨厭的 PostgreSQL 部分: https://ottertune.com/blog/the-part-of-postgresql-we-hate-the-most/

除非你的業務達到了 Uber 的規模,否則純粹的資料庫性能不是決定因素。像 Instagram, Notion 這樣的公司也能夠在超大規模下使用 Postgres。

三、功能 Features

對象層次結構

MySQL 采用了 4 級結構:

  • 執行個體
  • 資料庫

Postgres 采用了 5 級結構:

  • 執行個體(也稱為叢集)
  • 資料庫
  • 模式 Schema

ACID 事務

兩個資料庫都支援 ACID 事務,Postgres 提供更強大的事務支援。

全方位對比 Postgres 和 MySQL(2023 版)

安全性

Postgres 和 MySQL 都支援 RBAC。

Postgres 支援開箱即用的附加行級安全 (RLS),而 MySQL 需要建立額外的視圖來模拟此行為。

查詢優化器

Postgres 的查詢優化器更優秀,詳情參考此吐槽:https://news.ycombinator.com/item?id=29455852。

複制

Postgres 的标準複制使用 WAL 進行實體複制。MySQL 的标準複制使用 binlog 進行邏輯複制。

Postgres 也支援通過其釋出/訂閱模式進行邏輯複制。

JSON

Postgres 和 MySQL 都支援 JSON。Postgres 支援的功能更多:

Both Postgres and MySQL supports JSON column. Postgres supports more features:

  • 更多操作符來通路 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 之間做選擇仍然很困難,并且經常引起激烈辯論 https://news.ycombinator.com/item?id=35906604。

全方位對比 Postgres 和 MySQL(2023 版)
全方位對比 Postgres 和 MySQL(2023 版)

總的來說,Postgres 有更多功能、更繁榮的社群和生态;而 MySQL 則更易學習并且擁有龐大的使用者群體。

我們觀察到了與 Stack Overflow 結果相同的行業趨勢,即 Postgres 在開發者中變得越來越受歡迎。但根據我們的實際體驗,精密的 Postgres 犧牲了一些便利性。如果你對 Postgres 不太熟悉,最好從雲服務提供商那裡啟動一個執行個體,并運作幾個查詢來上手。有時候,這些額外好處可能并不值得,選擇 MySQL 會更容易一些。

同時,在一個組織内部共存 Postgres 和 MySQL 也是很常見的情況。

作者丨天舟

來源丨公衆号:Bytebase(ID:Bytebase)

dbaplus社群歡迎廣大技術人員投稿,投稿郵箱:[email protected]

關于我們

dbaplus社群是圍繞Database、BigData、AIOps的企業級專業社群。資深大咖、技術幹貨,每天精品原創文章推送,每周線上技術分享,每月線下技術沙龍,每季度Gdevops&DAMS行業大會。

關注公衆号【dbaplus社群】,擷取更多原創技術文章和精選工具下載下傳

繼續閱讀