一、開源方面
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的間隙鎖影響較大,鎖定數據較多。
六、性能
1、PostgreSQL
1)PostgreSQL廣泛用於讀寫速度高和數據一致性高的大型系統。此外,它還支持各種性能優化,當然這些優化僅在商業解決方案中可用,例如地理空間數據支持,沒有讀鎖定的併發性等等。
2)PostgreSQL性能最適用於需要執行復雜查詢的系統。
3)PostgreSQL在OLTP/ OLAP系統中表現良好,讀寫速度以及大數據分析方面表現良好,基於PG的GP數據庫,在數據倉庫領域表現良好。
4)PostgreSQL也適用於商業智能應用程序,但更適合需要快速讀/寫速度的數據倉庫和數據分析應用程序。
2、MySQL
1)MySQL是廣泛選擇的基於Web的項目,需要數據庫只是為了簡單的數據事務。但是,當遇到重負載或嘗試完成複雜查詢時,MySQL通常會表現不佳。
2)MySQL的讀取速度,在OLTP系統中表現良好。
3)MySQL + InnoDB為OLTP場景提供了非常好的讀/寫速度。總體而言,MySQL在高併發場景下表現良好。
4)MySQL是可靠的,並且與商業智能應用程序配合良好,因為商業智能應用程序通常讀取很多。
七、高可用技術的實現
1、PostgreSQL
1)基於流複製的異步、同步主從。
2)基於流複製的–keepalive。
3)基於流複製的 –repmgr。
4)基於流複製的 –patroni+etcd。
5)共享存儲HA(corosync+pacemaker)。
6)Postgres-XC。
7)Postgres-XL。
8)中間件實現:pgpool、pgcluster、slony、plploxy。
2、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優劣對比
1、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公司控制。
2、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引擎的大力發展,功能表現良好。
MySQL和PostgreSQL複雜的開源關係型數據庫,本文只是根據自己經驗寫的對PG和MySQL的理解,難免有不當之處,不當之處還請大家多多指正,我們的LCRM系統最終還是用了PostgreSQL