PostgreSQL 與 MySQL比較:
一、pg優勢:
- MySQL 不支持 OVER 子句, 而 Pg 支持
- 它可以存儲 array 和 json, 可以在 array 和 json 上建索引, 甚至還能用表達式索引. 為了實現文檔數據庫的功能, 設計了 jsonb 的存儲結構
- 用 Pg + PostgREST 直接生成后端 API 是非常快速高效的辦法
- Pg 可以高效處理樹結構;高效處理圖結構, 輕松實現 "朋友的朋友的朋友" 這種功能;支持 trigram 索引;
- 自帶全文搜索功能(不用費勁再裝一個 elasticsearch 咯);
- 可以把 70 種外部數據源 (包括 Mysql, Oracle, CSV, hadoop ...) 當成自己數據庫中的表來查詢:
Foreign data wrappers - 有地理信息處理擴展
- PG 的“無鎖定”特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系
- PG 的有多種集群架構可以選擇,plproxy 可以支持語句級的鏡像或分片,slony 可以進行字段級的同步設置,standby 可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單。
- PG 的 TEXT 類型可以直接訪問,SQL語法內置正則表達式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔數據庫都可以省了。
-
mysql到現在也是異步復制,pgsql可以做到同步,異步,半同步復制。還有mysql的同步是基於binlog復制,類似oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合異地復制,pgsql的復制基於wal,可以做到同步復制。同時,pgsql還提供stream復制。
- pgsql對於numa架構的支持比mysql強一些,比MYSQL對於讀的性能更好一些,pgsql提交可以完全異步,而mysql的內存表不夠實用(因為表鎖的原因)
- 1、在SQL的標准實現上要比MySQL完善,而且功能實現比較嚴謹;
- 2、存儲過程的功能支持要比MySQL好,具備本地緩存執行計划的能力;
- 3、對表連接支持較完整,優化器的功能較完整,支持的索引類型很多,復雜查詢能力較強;
- 4、PG主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數據量。
- 5、PG的主備復制屬於物理復制,相對於MySQL基於binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。
- 6、MySQL的存儲引擎插件化機制,存在鎖機制復雜影響並發的問題,而PG不存在。
二、MySQL相對於PG的優勢:
第一,MySQL有一些實用的運維支持,如 slow-query.log ,這個pg肯定可以定制出來,但是如果可以配置使用就更好了。
第二,mysql的innodb引擎,可以充分優化利用系統所有內存,超大內存下PG對內存使用的不那么充分,
第三,MySQL的復制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。
第四,從測試結果上看,mysql 5.5的性能提升很大,單機性能強於pgsql,5.6應該會強更多.
第五,對於web應用來說,mysql 5.6 的內置MC API功能很好用,PGSQL差一些。
mysql的優勢在於SQL層與存儲層的分離。甚至可以支持每個表使用不同的存儲引擎。
1、innodb的基於回滾段實現的MVCC機制,相對PG新老數據一起存放的基於XID的MVCC機制,是占優的。
2、MySQL采用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結構設計存在約束;
3、MySQL的優化器較簡單,系統表、運算符、數據類型的實現都很精簡,非常適合簡單的查詢操作;
4、MySQL分區表的實現要優於PG的基於繼承表的分區實現,主要體現在分區個數達到上千上萬后的處理性能差異較大。
5、MySQL的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態數據的查詢場景。
2、MySQL采用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結構設計存在約束;
3、MySQL的優化器較簡單,系統表、運算符、數據類型的實現都很精簡,非常適合簡單的查詢操作;
4、MySQL分區表的實現要優於PG的基於繼承表的分區實現,主要體現在分區個數達到上千上萬后的處理性能差異較大。
5、MySQL的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態數據的查詢場景。