一、開源方面
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)基于流複制的異步、同步主從。
2)基于流複制的–keepalive。
3)基于流複制的 –repmgr。
4)基于流複制的 –patroni+etcd。
5)共享存儲HA(corosync+pacemaker)。
6)Postgres-XC。
7)Postgres-XL。
8)中間件實作:pgpool、pgcluster、slony、plploxy。
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