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

来源:https://www.cnblogs.com/88223100/archive/2023/08/10/Comprehensive-comparison-between-Postgres-and-MySQL-2023.html
-Advertisement-
Play Games

根據 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 事務

 

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

圖片

 

安全性

 

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 則更易學習並且擁有龐大的用戶群體。

 

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

 

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

 

作者丨天舟

本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Comprehensive-comparison-between-Postgres-and-MySQL-2023.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 屏蔽驅動列印信息 root許可權:echo "1 4 1 7" > /proc/sys/kernel/printk sudo sh -c "sudo echo "1 4 1 7" > /proc/sys/kernel/printk 實現觸摸屏校驗 第一次進入Linux系統時,會出現觸摸校驗提示,按提示 ...
  • 平時在運維的時候,有時候SSH無法使用的情況下就需要備用telnet遠程,本文就簡單分享如何安裝配置telnet遠程 一、獲取安裝包 安裝包需要準備telnet\telnet-server\xintet,都是非常成熟的軟體,可線上直接安裝。 線上安裝: yum install telnet teln ...
  • ## 首先 - 聲明:這是轉載,我只是做一個記錄,以下內容可解決問題(本人已嘗試並已解決),當然也可以去轉載出處查看大佬的原回答: >[Win10系統, administrator賬戶被微軟賬戶強行綁定,怎麼破? - 海爾森肯威的回答 - 知乎](https://www.zhihu.com/ques ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230809235422409-1190410594.png) # 1. 2版DB版本 ## 1.1. DB2 11.5 ## 1.2. Oracle 19c ## 1.3.  ...
  • “數據孤島”簡單的講,各組織都持有各自的數據,這些數據之間互有關係但又獨立存儲於各組織。出於安全性、合規性等方面考慮,各組織只能查詢、使用己方數據,無法交換其它組織的數據。在聯邦學習出現前,針對數據隱私保護的密碼學已應用於本地數據機器學習,隨著“數據孤島”問題的浮現,聯邦學習的概念出現併發展的日益成... ...
  • 1 pentaho簡介 `pentaho`是一款開源`ETL`工具,純java編寫的C/S模式的工具,可綠色免安裝,開箱即用。支持Windows、macOS、Linux平臺。 ...
  • 本文分享自華為雲社區《openGauss資料庫在CentOS上的安裝實踐》,作者:Gauss小松鼠 。 1.安裝前準備 安裝資料庫前先要有已安裝centOS 7.6的伺服器+資料庫安裝包。 首先找小伙伴申請了華為雲ECS伺服器安裝好了OS,這裡使用的是x86_64+centos。 華為雲伺服器現在可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...