根據 2023 年的 Stack Overflow 調研 (https://survey.stackoverflow.co/2023/) ,Postgres 已經取代 MySQL 成為最受敬仰和渴望 (the most admired, desired) 的資料庫。 隨著 Postgres 的發展勢 ...
根據 2023 年的 Stack Overflow 調研
(https://survey.stackoverflow.co/2023/) ,Postgres 已經取代 MySQL 成為最受敬仰和渴望 (the most admired, desired) 的資料庫。
隨著 Postgres 的發展勢頭愈發強勁,在 Postgres 和 MySQL 之間做選擇變得更難了。
如果看安裝數量,MySQL 可能仍是全球最大的開源資料庫。
Postgres 則自詡為全球最先進的開源關係型資料庫。
因為需要與各種資料庫及其衍生產品集成,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/)。
一、許可證 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 事務,Postgres 提供更強大的事務支持。
Postgres 和 MySQL 都支持 RBAC。
Postgres 支持開箱即用的附加行級安全 (RLS),而 MySQL 需要創建額外的視圖來模擬此行為。
Postgres 的查詢優化器更優秀,詳情參考此吐槽:https://news.ycombinator.com/item?id=29455852。
Postgres 的標準複製使用 WAL 進行物理複製。MySQL 的標準複製使用 binlog 進行邏輯複製。
Postgres 也支持通過其發佈/訂閱模式進行邏輯複製。
Postgres 和 MySQL 都支持 JSON。Postgres 支持的功能更多:
Both Postgres and MySQL supports JSON column. Postgres supports more features:
-
更多操作符來訪問 JSON 功能。
-
允許在 JSON 欄位上創建索引。
Postgres 對 CTE 的支持更全面:
-
在 CTE 內進行 SELECT, UPDATE, INSERT, DELETE 操作
-
在 CTE 之後進行 SELECT, UPDATE, INSERT, DELETE 操作
MySQL 支持:
-
在 CTE 內進行 SELECT 操作
-
在 CTE 之後進行 SELECT, UPDATE, DELETE 操作
-
視窗幀類型: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 則更易學習並且擁有龐大的用戶群體。
我們觀察到了與 Stack Overflow 結果相同的行業趨勢,即 Postgres 在開發者中變得越來越受歡迎。但根據我們的實際體驗,精密的 Postgres 犧牲了一些便利性。如果你對 Postgres 不太熟悉,最好從雲服務提供商那裡啟動一個實例,並運行幾個查詢來上手。有時候,這些額外好處可能並不值得,選擇 MySQL 會更容易一些。
同時,在一個組織內部共存 Postgres 和 MySQL 也是很常見的情況。
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Comprehensive-comparison-between-Postgres-and-MySQL-2023.html