為了弄明白PostgreSQL和MySQL的差别,我搜尋了關鍵字:MySQL vs PostgreSQL,并看了第一頁的幾個文章。以下是簡單總結:
比較版本:PostgreSQL 11 VS MySQL5.7(innodb引擎)
搜尋量
首先根據百度搜尋量可以看出,近一年内MySQL的平均搜尋量是pg的4倍多,給人的第一感覺就是MySQL的使用量更高一點
搜尋量
協定
協定上,pg的協定更加寬容,不要求基于pg開發的軟體也必須開源,MySQL的GPL協定要求使用它開發的軟體也必須開源,否則就需要付費。雖然這看起來PG對各類型的使用者都更友好,但這一點也是缺點,由于使用PG可以不開源,是以如果基于pg開發的軟體最後都閉環發展,就會導緻好的技術不會吸收到主幹道上,而MySQL就沒有這一弊端,長遠來看,MySQL的生命力就會越來越強。
版本分支
- PGSQL隻有社群版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社群版有所有功能,不像SQL Server和MySQL有标準版、企業版、經典版、社群版、開發版、web版之分國内外還有一些基于PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些隻是二次開發并不算獨立分支
- MySQL由于曆史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不相容Oracle官方分支還有版本之分,分為标準版、企業版、經典版、社群版
安裝方式
- PGSQL有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進制包,一般用源碼編譯安裝,安裝時間會長一些,執行指令多一些
- MySQL有各個平台的包rpm包,deb包等等,源碼編譯安裝、二進制包安裝,一般用二進制包安裝,友善快捷
架構
- MySQL是多線程。雖然多線程架構,但是官方有限制連接配接數,原因是系統的并發度是有限的,線程數太多,反而系統的處理能力下降,随着連接配接數上升,反而性能下降一般同時隻能處理200 ~300個資料庫連接配接
- PG是多程序。并發連接配接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁記憶體
- 多線程架構和多程序架構之間沒有絕對的好壞,例如oracle在unix上是多程序架構,在windows上是多線程架構。
對存儲過程及事務的支援能力
- MySQL對于無事務的MyISAM表,采用表鎖定,一個長時間運作的查詢很可能會長時間地阻礙對表的更新,而PostgreSQL不存在這樣的問題。
- PostgreSQL支援存儲過程,要比MySQL好,具備本地緩存執行計劃的能力;
- MySQL 4.0.2-alpha開始支援事務的概念,保留無事務的表類型, 為使用者提供了更多的選擇。
穩定性及性能
- 高并發讀寫,負載逼近極限下,PG的性能名額高于mysql
- mysql的innodb引擎可以優化利用系統所有記憶體,超大記憶體下PG對記憶體的使用不那麼充分。
- PostgreSQL 的穩定性極強, Innodb 等引擎在崩潰、斷電之類的災難場景下抗打擊能力有了長足進步,然而很多 MySQL 使用者都遇到過Server級的資料庫丢失的場景——mysql系統庫是MyISAM的,相比之下,PG資料庫這方面要好一些。
資料同步方式
- mysql到現在也是異步複制,pgsql可以做到同步,異步,半同步複制。
- mysql的同步是基于binlog複制,類似oracle golden gate,是基于stream的複制,做到同步很困難,這種方式更加适合異地複制;pgsql的複制基于wal,可以做到同步複制。同時,pgsql還提供stream複制。
- MySQL的複制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。
- PG的主備複制屬于實體複制,相對于MySQL基于binlog的邏輯複制,資料的一緻性更加可靠,複制性能更高,對主機性能的影響也更小。
對SQL語句的支援
- PG在SQL的标準實作上要比MySQL完善,而且功能實作比較嚴謹;
- PG對表連接配接支援較完整,優化器的功能較完整,支援的索引類型很多,複雜查詢能力較強
- MySQL的Join操作的性能非常的差,隻支援Nest Join,是以一旦資料量大,性能就非常的差。PostgreSQL除了支援nest join外,還支援hash join和 sort merge join;PostgreSQL支援正規表達式查找,MySQL不支援
資料類型方面
- PGSQL資料類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型字段最大存儲1GB
- MySQL資料類型不夠豐富
索引類型
- PGSQL多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)
- MySQLbtree 索引,全文索引(低效),表達式索引(需要建虛拟列),hash 索引隻在記憶體表
主從複制安全性
- PGSQL同步流複制、強同步(remote apply)、高安全,不會丢資料PGSQL同步流複制:所有從庫當機,主庫會罷工,主庫無法自動切換為異步流複制(異步模式),需要通過增加從庫數量來解決,一般生産環境至少有兩個從庫手動解決:在PG主庫修改參數synchronous_standby_names ='',并執行指令:pgctl reload ,把主庫切換為異步模式主從資料完全一緻是高可用切換的第一前提,是以PGSQL選擇主庫罷工也是可以了解。
- MySQL增強半同步複制 ,mysql5.7版本增強半同步才能保證主從複制時候不丢資料mysql5.7半同步複制相關參數:參數rpl_semi_sync_master_wait_for_slave_count 等待至少多少個從庫接收到binlog,主庫才送出事務,一般設定為1,性能最高參數rpl_semi_sync_master_timeout 等待多少毫秒,從庫無回應自動切換為異步模式,一般設定為無限大,不讓主庫自動切換為異步模式所有從庫當機,主庫會罷工,因為無法收到任何從庫的應答包手動解決:在MySQL主庫修改參數rpl_semi_sync_master_wait_for_slave_count=0
備份恢複
- PGSQL備份恢複非常簡單,時點恢複操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)假如有一個三節點的PGSQL主從叢集,可以随便在其中一個節點做完整備份和wal歸檔備份
- MySQL備份恢複相對不太簡單,完整備份+binlog備份(增量)完整備份需要percona的XtraBackup工具做實體備份,MySQL本身不支援實體備份時點恢複操作步驟繁瑣複雜。
插件功能
- PGSQL支援插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等
- MySQL不支援插件功能
總結
PG和MySQL的差別仍然還有很多沒有列出,簡單點總結,pg更重視功能,擴充性強,可閉環發展,是以在政府、金融、銀行用的比較多。MySQL重在速度,速度高于pg,使用更加簡單便捷,是以它在網際網路上使用的比較多,建議在選擇這兩種資料庫時,考慮不要隻停留在資料庫層面,還需要考慮到團隊的技術棧、應用的規模和複雜性、預期的使用者負載等。