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:
-
PostgreSQL廣泛用於讀寫速度高和資料一致性高的大型系統。此外,它還支援各種效能優化,當然這些優化僅在商業解決方案中可用,例如地理空間資料支援,沒有讀鎖定的併發性等等。
-
PostgreSQL效能最適用於需要執行復雜查詢的系統。
-
PostgreSQL在OLTP/ OLAP系統中表現良好,讀寫速度以及大資料分析方面表現良好,基於PG的GP資料庫,在資料倉庫領域表現良好。
-
PostgreSQL也適用於商業智慧應用程式,但更適合需要快速讀/寫速度的資料倉庫和資料分析應用程式。
- MySQL:
- MySQL是廣泛選擇的基於Web的專案,需要資料庫只是為了簡單的資料事務。但是,當遇到重負載或嘗試完成複雜查詢時,MySQL通常會表現不佳。
- MySQL的讀取速度,在OLTP系統中表現良好。
- MySQL + InnoDB為OLTP場景提供了非常好的讀/寫速度。總體而言,MySQL在高併發場景下表現良好。
- MySQL是可靠的,並且與商業智慧應用程式配合良好,因為商業智慧應用程式通常讀取很多。
高可用方面:
- PostgreSQL
- 基於流複製的非同步、同步主從。
- 基於流複製的-keepalive。
- 基於流複製的 -repmgr。
- 基於流複製的 -patroni+etcd。
- 共享儲存HA(corosync+pacemaker)。
- Postgres-XC。
- Postgres-XL。
- 中介軟體實現:pgpool、pgcluster、slony、plploxy。
- MySQL
- 主從複製。
- 主主復。
- MHA。
- LVS+KEEPALIVE。
- MGR分散式資料庫,多點寫入[不建議],基於paxos協議。
- PXC分散式資料庫,多點寫入[不建議],基於令牌環協議。
- INNODB CLUSTER[8.0新技術,基於MGR實現,上層封裝命令],基於paxos協議。
- 中介軟體實現:mycat。
外部資料來源:
-
PostgreSQL FDW -[foreign-data wrapper的一個簡稱,可以叫外部封裝。
PostgreSQL不支援多資料引擎。但支援Extension元件擴充,以及通過名為FDW的技術將Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV檔案等作為外部表進行讀寫操作,因此,可以為大資料與關係型資料庫提供良好對接。
-
MySQL:無。
資料儲存和資料型別:
-
PG主表採用堆表存放,存放的資料量較大,資料訪問方式類似於Oracle的堆表。
-
MySQL採用索引組織表,MySQL必須有主鍵索引,所有的資料訪問都是通過主鍵實現,二級索引訪問時,需要掃描兩遍索引(主鍵和二級索引)。
PostgreSQL與MySQL優劣對比
PostgreSQL相對於MySQL的優勢:
- 在SQL的標準實現上要比MySQL完善,而且功能實現比較嚴謹。
- 儲存過程的功能支援要比MySQL好,具備本地快取執行計劃的能力。
- 對錶連線支援較完整,優化器的功能較完整,支援的索引型別很多,複雜查詢能力較強。
- PG主表採用堆表存放,MySQL採用索引組織表,能夠支援比MySQL更大的資料量。
- PG的主備複製屬於物理複製,相對於MySQL基於binlog的邏輯複製,資料的一致性更加可靠,複製效能更高,對主機效能的影響也更小。
- MySQL的儲存引擎外掛化機制,存在鎖機制複雜影響併發的問題,而PG不存在。
- PG對可以實現外部資料來源查詢,資料來源的支援型別豐富。
- PG原生的邏輯複製可以實現表級別的訂閱釋出,可以實現資料通過kafka流轉,而不需要其他的元件。
- PG支援三種表連線方式,巢狀迴圈,雜湊連線,排序合併,而MySQL只支援巢狀迴圈。
- PostgreSQL原始碼寫的很清晰,易讀性比MySQL強太多了。
- PostgreSQL通過PostGIS擴充套件支援地理空間資料。地理空間資料有專用的型別和功能,可直接在資料庫級別使用,使開發人員更容易進行分析和編碼。
- 可擴充套件型系統,有豐富可擴充套件元件,作為contribute釋出。
- PostgreSQL支援JSON和其他NoSQL功能,如本機XML支援和使用HSTORE的鍵值對。它還支援索引JSON資料以加快訪問速度,特別是10版本JSONB更是強大。
- PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。相反,MySQL現在主要是被Oracle公司控制。
MySQL相對於PG的優勢:
- innodb的基於回滾段實現的MVCC機制,相對PG新老資料一起存放的基於XID的MVCC機制,是佔優的。新老資料一起存放,需要定時觸 發VACUUM,會帶來多餘的IO和資料庫物件加鎖開銷,引起資料庫整體的併發能力下降。而且VACUUM清理不及時,還可能會引發資料膨脹。
- MySQL採用索引組織表,這種儲存方式非常適合基於主鍵匹配的查詢、刪改操作,但是對錶結構設計存在約束。
- MySQL的優化器較簡單,系統表、運算子、資料型別的實現都很精簡,非常適合簡單的查詢操作。
- MySQL相對於PG在國內的流行度更高,PG在國內顯得就有些落寞了。
- MySQL的儲存引擎外掛化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態資料的查詢場景。
總結:
總體上來說,開源資料庫都不是很完善,商業資料庫oracle在架構和功能方面都還是完善很多的。從應用場景來說,PG更加適合嚴格的企業應用場景(比如金融、電信、ERP、CRM),但不僅僅限制於此,PostgreSQL的json,jsonb,hstore等資料格式,特別適用於一些大資料格式的分析;而MySQL更加適合業務邏輯相對簡單、資料可靠性要求較低的網際網路場景(比如google、facebook、alibaba),當然現在MySQL的在innodb引擎的大力發展,功能表現良好。
MySQL 和 PostgreSQL 複雜的開源關係型資料庫,本文只是作者根據自己經驗寫的對PG和MySQL的理解,難免有不當之處,不當之處還請大家多多指正。
MySQL在國內的發展已然很成熟,但是如果你轉向PostgreSQL,會發現不一樣的天地,學院派的風格,豐富的功能,肯定會給你帶來不一樣的驚喜。