1. 程式人生 > 其它 >PostgreSQL和MySQL的優劣對比

PostgreSQL和MySQL的優劣對比

在開發專案的過程中,難免要面對選擇資料庫的情況。總結此文章是因為在之前公司裡使用的都是MYSQL 資料庫,而在現在公司裡,新專案中使用的是 PostgreSQL 資料庫,在使用過程中,經常需要查詢兩種資料庫在使用過程中的不同,而且在 MYSQL 中的部分實現,如何在 PostgreSQL 中實現。

原文連結:https://blog.csdn.net/weixin_40983094/article/details/119027700


下面我將從以下幾個方面闡述MySQL和PostgreSQL的異同和優劣:

開源性:

PostgreSQL: The world's most advanced open source database。

  • 開源協議:PostgreSQL基於自由的BSD/MIT許可,組織可以使用、複製、修改和重新分發程式碼,只需要提供一個版權宣告即可。

  • PG的開源協議特別靈活,任何公司的和個人都可以把PG作為一個產品銷售,而不需要像MySQL那樣必須修改大部分程式碼才可以作為公司的產品。
    MySQL:World's Most Popular Open Source Database。

  • 開源協議:核心程式碼基於GPL或Commercial License。

  • MySQL的開源協議是基於GPL協議,任何公司都可以免費使用,不允許修改後和衍生的程式碼做為閉源的商業軟體釋出和銷售,MySQL的版權在甲骨文手中,甲骨文可以推了其商業閉源版本。

事務支援:

  • PostgreSQL支援事務的強一致性,事務保證性好,完全支援ACID特性。

  • MySQL只有innodb引擎支援事務,事務一致性保證上可根據實際需求調整,為了最大限度的保護資料,MySQL可配置雙一模式,對ACID的支援上比PG稍弱弱。

SQL標準支援:

  • PostgreSQL幾乎支援所有的SQL標準,支援型別相當豐富。

  • MySQL只支援部分SQL標準,相比於PG支援型別稍弱。

資料複製:

  • MySQL的複製是基於binlog的邏輯非同步複製,無法實現同步複製。
    複製模式:

    一主一備

一主多備
級聯複製
迴圈複製
主主複製

資料流轉優勢:通過canal增量資料的訂閱和消費,可以同步資料到kafka,通過kafka做資料流轉。

**MySQL**所有的高可用方案都是基於binlog做的同步,以及基於**MySQL**的分散式資料也是基於MySQL的binlog實現,binlog是MySQL生態圈最基本技術實現。
  • PostgreSQL可以做到同步,非同步,半同步複製,以及基於日誌邏輯複製,可以實現表級別的訂閱和釋出。
    複製模式:

    *   一主一備。
    
    • 一主多備。
    • 級聯複製。
    • 熱備庫/流複製。
    • 邏輯複製。

資料流轉優勢:通過邏輯複製實現訊息的訂閱和消費,可以同步資料到kafka,通過kafka實現資料流轉。

併發控制併發控制:

  • PostgreSQL通過其MVCC實現有效地解決了併發問題,從而實現了非常高的併發性。

    PG新老資料一起存放的基於XID的MVCC機制,新老資料一起存放,需要定時觸發VACUUM,會帶來多餘的IO和資料庫物件加鎖開銷,引起資料庫整體的併發能力下降。而且VACUUM清理不及時,還可能會引發資料膨脹。

    當然 PostgreSQL 還有一點影響比較,為了保證事務的強一致性,未決事務會影響所有表VACUUM清理,導致表膨脹。

  • MySQL 僅在InnoDB中支援MVCC(併發版本控制)。

    innodb的基於回滾段實現的MVCC機制,但是MySQL的間隙鎖影響較大,鎖定資料較多。

效能方面:

  • PostgreSQL:
  1. PostgreSQL廣泛用於讀寫速度高和資料一致性高的大型系統。此外,它還支援各種效能優化,當然這些優化僅在商業解決方案中可用,例如地理空間資料支援,沒有讀鎖定的併發性等等。

  2. PostgreSQL效能最適用於需要執行復雜查詢的系統。

  3. PostgreSQL在OLTP/ OLAP系統中表現良好,讀寫速度以及大資料分析方面表現良好,基於PG的GP資料庫,在資料倉庫領域表現良好。

  4. PostgreSQL也適用於商業智慧應用程式,但更適合需要快速讀/寫速度的資料倉庫和資料分析應用程式。

  • MySQL:
  1. MySQL是廣泛選擇的基於Web的專案,需要資料庫只是為了簡單的資料事務。但是,當遇到重負載或嘗試完成複雜查詢時,MySQL通常會表現不佳。
  2. MySQL的讀取速度,在OLTP系統中表現良好。
  3. MySQL + InnoDB為OLTP場景提供了非常好的讀/寫速度。總體而言,MySQL在高併發場景下表現良好。
  4. MySQL是可靠的,並且與商業智慧應用程式配合良好,因為商業智慧應用程式通常讀取很多。

高可用方面:

  • PostgreSQL
  1. 基於流複製的非同步、同步主從。
  2. 基於流複製的-keepalive。
  3. 基於流複製的 -repmgr。
  4. 基於流複製的 -patroni+etcd。
  5. 共享儲存HA(corosync+pacemaker)。
  6. Postgres-XC。
  7. Postgres-XL。
  8. 中介軟體實現:pgpool、pgcluster、slony、plploxy。
  • MySQL
  1. 主從複製。
  2. 主主復。
  3. MHA。
  4. LVS+KEEPALIVE。
  5. MGR分散式資料庫,多點寫入[不建議],基於paxos協議。
  6. PXC分散式資料庫,多點寫入[不建議],基於令牌環協議。
  7. INNODB CLUSTER[8.0新技術,基於MGR實現,上層封裝命令],基於paxos協議。
  8. 中介軟體實現:mycat。

外部資料來源:

  • PostgreSQL FDW -[foreign-data wrapper的一個簡稱,可以叫外部封裝。

    PostgreSQL不支援多資料引擎。但支援Extension元件擴充,以及通過名為FDW的技術將Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV檔案等作為外部表進行讀寫操作,因此,可以為大資料與關係型資料庫提供良好對接。

  • MySQL:無。

資料儲存和資料型別:

  • PG主表採用堆表存放,存放的資料量較大,資料訪問方式類似於Oracle的堆表。

  • MySQL採用索引組織表,MySQL必須有主鍵索引,所有的資料訪問都是通過主鍵實現,二級索引訪問時,需要掃描兩遍索引(主鍵和二級索引)。

PostgreSQL與MySQL優劣對比

PostgreSQL相對於MySQL的優勢:

  1. 在SQL的標準實現上要比MySQL完善,而且功能實現比較嚴謹。
  2. 儲存過程的功能支援要比MySQL好,具備本地快取執行計劃的能力。
  3. 對錶連線支援較完整,優化器的功能較完整,支援的索引型別很多,複雜查詢能力較強。
  4. PG主表採用堆表存放,MySQL採用索引組織表,能夠支援比MySQL更大的資料量。
  5. PG的主備複製屬於物理複製,相對於MySQL基於binlog的邏輯複製,資料的一致性更加可靠,複製效能更高,對主機效能的影響也更小。
  6. MySQL的儲存引擎外掛化機制,存在鎖機制複雜影響併發的問題,而PG不存在。
  7. PG對可以實現外部資料來源查詢,資料來源的支援型別豐富。
  8. PG原生的邏輯複製可以實現表級別的訂閱釋出,可以實現資料通過kafka流轉,而不需要其他的元件。
  9. PG支援三種表連線方式,巢狀迴圈,雜湊連線,排序合併,而MySQL只支援巢狀迴圈。
  10. PostgreSQL原始碼寫的很清晰,易讀性比MySQL強太多了。
  11. PostgreSQL通過PostGIS擴充套件支援地理空間資料。地理空間資料有專用的型別和功能,可直接在資料庫級別使用,使開發人員更容易進行分析和編碼。
  12. 可擴充套件型系統,有豐富可擴充套件元件,作為contribute釋出。
  13. PostgreSQL支援JSON和其他NoSQL功能,如本機XML支援和使用HSTORE的鍵值對。它還支援索引JSON資料以加快訪問速度,特別是10版本JSONB更是強大。
  14. PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。相反,MySQL現在主要是被Oracle公司控制。

MySQL相對於PG的優勢:

  1. innodb的基於回滾段實現的MVCC機制,相對PG新老資料一起存放的基於XID的MVCC機制,是佔優的。新老資料一起存放,需要定時觸 發VACUUM,會帶來多餘的IO和資料庫物件加鎖開銷,引起資料庫整體的併發能力下降。而且VACUUM清理不及時,還可能會引發資料膨脹。
  2. MySQL採用索引組織表,這種儲存方式非常適合基於主鍵匹配的查詢、刪改操作,但是對錶結構設計存在約束。
  3. MySQL的優化器較簡單,系統表、運算子、資料型別的實現都很精簡,非常適合簡單的查詢操作。
  4. MySQL相對於PG在國內的流行度更高,PG在國內顯得就有些落寞了。
  5. MySQL的儲存引擎外掛化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態資料的查詢場景。

總結:

總體上來說,開源資料庫都不是很完善,商業資料庫oracle在架構和功能方面都還是完善很多的。從應用場景來說,PG更加適合嚴格的企業應用場景(比如金融、電信、ERP、CRM),但不僅僅限制於此,PostgreSQL的json,jsonb,hstore等資料格式,特別適用於一些大資料格式的分析;而MySQL更加適合業務邏輯相對簡單、資料可靠性要求較低的網際網路場景(比如google、facebook、alibaba),當然現在MySQL的在innodb引擎的大力發展,功能表現良好。

MySQLPostgreSQL 複雜的開源關係型資料庫,本文只是作者根據自己經驗寫的對PG和MySQL的理解,難免有不當之處,不當之處還請大家多多指正。

MySQL在國內的發展已然很成熟,但是如果你轉向PostgreSQL,會發現不一樣的天地,學院派的風格,豐富的功能,肯定會給你帶來不一樣的驚喜。