天天看點

PG和Mysql哪個更加适合企業一、開源方面二、ACID支援方面三、SQL标準的支援方面四、複制五、并發控制六、性能七、高可用技術的實作八、外部資料源九、資料存儲和資料類型十、PostgreSQL與MySQL優劣對比總結

一、開源方面

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的版權在甲骨文手中,甲骨文可以推了其商業閉源版本。

PG和Mysql哪個更加适合企業一、開源方面二、ACID支援方面三、SQL标準的支援方面四、複制五、并發控制六、性能七、高可用技術的實作八、外部資料源九、資料存儲和資料類型十、PostgreSQL與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