當前國內的現狀,互聯網公司使用 MySQL 的較多,PostgreSQL 的使用比例反而不高,但相信看到 PG 的新特性后,你會愛上她。當然 MySQL 作為最流行的數據庫,依然會吸引大部分人的眼球。
PostgreSQL 標榜自己是世界上很先進的開源數據庫,甚至 PG 粉絲或者一些 PGER 宣稱,她可以和 Oracle 相媲美(雖然 PG 很強大,但是和 Oracle 還是有差距的,當然 PG 優勢也是顯而易見的),而且沒有那么昂貴的價格和傲慢的客服。
當然 PG 功能完善和強大是最早始於 9 版本,在 10 版本快速發展,增加很多功能和特性。
PostgreSQL 是完全由社區驅動的開源項目,他的核心代碼,都是由社區維護,商用版本都是基於 PG 做的二次開發。
MySQL 聲稱自己是最流行的開源數據。看現在國內的現狀,稱得上名副其實。MySQL 被賣幾次后,最終落到 Oracle 公司的囊中。
正是因此,MySQL 之父 Monty,修改了 MySQL 的源代碼,創立了 MariaDB 分支。
說到這里當然不得不提另一個重要的分支,Percana 公司的 Percona Server。
Percona 公司更擅長 MySQL 運維,開發了很多非常實用運維工具,而且都已經開源,並回饋給社區,像 XtraBackup 和 pt-Toolkits 工具。
簡單對比 MySQL 和 PostgreSQL 發現,MySQL 背后是成熟的商業公司(Oracle 有自己的 MySQL 企業版,收費,有許多社區版沒有的特性),而 PostgreSQL 背后是一個龐大的志願開發組。
相比而言,PostgreSQL 的商業性質更少一些,他沒有所謂的 PostgreSQL 企業版,但是存在基於 PG 開發的一些企業級的 PG 數據庫。
下面我將從以下幾個方面闡述 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 的版權在甲骨文手中,甲骨文可以推了其商業閉源版本。
如上圖所示,開源軟件協議
ACID 支持方面
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,會發現不一樣的天地,學院派的風格,豐富的功能,肯定會給你帶來不一樣的驚喜。
本文轉自:https://yq.aliyun.com/articles/767728?spm=a2c4e.11163080.searchblog.9.7aa82ec1Cq1ErG