【乾貨總結】:可能是史上最全的MySQL和PGSQL對比材料

  • 2019 年 10 月 7 日
  • 筆記

【乾貨總結】:可能是史上最全的MySQL和PGSQL的對比材料

運維了MySQL和PGSQL已經有一段時間了,最近接到一個資料庫選型需求,於是便開始收集資料整理了一下,然後就有了下面的對比表

關鍵詞:PostgreSQL 11、MySQL5.7

 

比較版本:PostgreSQL 11    VS      MySQL5.7(innodb引擎) Oracle官方社區版

版權情況:PostgreSQL 11(免費開源)、MySQL5.7 Oracle官方社區版(免費開源)


1. CPU限制

PGSQL
沒有CPU核心數限制,有多少CPU核就用多少
 
 
MySQL
能用128核CPU,超過128核用不上

 2. 配置文件參數

PGSQL
一共有255個參數,用到的大概是80個,參數比較穩定,用上個大版本配置文件也可以啟動當前大版本資料庫
 
 
MySQL
一共有707個參數,用到的大概是180個,參數不斷增加,就算小版本也會增加參數,大版本之間會有部分參數不兼容情況

3. 第三方工具依賴情況

PGSQL
只有高可用集群需要依靠第三方中間件,例如:patroni+etcd、repmgr
 
 
MySQL
大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,學習成本高,高可用集群也需要第三方中間件,官方MGR集群還沒成熟

4. 底層主從複製原理

PGSQL
物理複製,跟SQL Server鏡像/AlwaysOn一樣,嚴格一致,沒有任何可能導致不一致,性能和可靠性上,物理複製完勝邏輯複製,維護簡單   
 
 
MySQL
邏輯複製,(sql_log_bin、binlog_format等參數設置不正確都會導致主從不一致)
大事務並行複製效率低,對於重要業務,需要依賴 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比較和修復主從一致
主從複製出錯嚴重時候需要重搭主從
MySQL的邏輯複製並不阻止兩個不一致的資料庫建立複製關係

5. 從庫只讀狀態

PGSQL
系統自動設置從庫默認只讀,不需要人工介入,維護簡單   
 
 
MySQL
從庫需要手動設置參數super_read_only=on,讓從庫設置為只讀,super_read_only參數有bug,鏈接:https://baijiahao.baidu.com/s?id=1636644783594388753&wfr=spider&for=pc

6. 版本分支

PGSQL
只有社區版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社區版有所有功能,不像SQL Server和MySQL有標準版、企業版、經典版、社區版、開發版、web版之分
中國外還有一些基於PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些只是二次開發並不算獨立分支
 
 
MySQL
由於歷史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不兼容
Oracle官方分支還有版本之分,分為標準版、企業版、經典版、社區版

7. SQL特性支援

PGSQL
SQL特性支援情況支援94種,SQL語法支援最完善,例如:支援公用表表達式(WITH查詢)
 
 
MySQL
SQL特性支援情況支援36種,SQL語法支援比較弱,例如:不支援公用表表達式(WITH查詢)
 

關於SQL特性支援情況的對比,可以參考:http://www.sql-workbench.net/dbms_comparison.html


8. 主從複製安全性

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

9. 多欄位統計資訊

PGSQL
支援多欄位統計資訊
 
 
MySQL
不支援多欄位統計資訊

10. 索引類型

PGSQL
多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)
 
 
MySQL

btree 索引,全文索引(低效),表達式索引(需要建虛擬列),hash 索引只在記憶體表


11. 物理表連接演算法

PGSQL
支援  nested-loop join 、hash join 、merge join   
 
 
MySQL

只支援  nested-loop join


12. 子查詢和視圖性能

PGSQL
子查詢,視圖優化,性能比較高
 
 
MySQL

視圖謂詞條件下推限制多,子查詢上拉限制多


13. 執行計劃即時編譯

PGSQL
支援  JIT    執行計劃即時編譯,使用LLVM編譯器
 
 
MySQL

不支援執行計劃即時編譯


14. 並行查詢

PGSQL
並行查詢(多種並行查詢優化方法),並行查詢一般多見於商業資料庫,是重量級功能
 
 
MySQL

有限,只支援主鍵並行查詢


15. 物化視圖

PGSQL
支援物化視圖
 
 
MySQL

不支援物化視圖


16. 插件功能

PGSQL
支援插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等
 
 
MySQL

不支援插件功能


17. check約束

PGSQL
支援check約束
 
 
MySQL

不支援check約束,可以寫check約束,但存儲引擎會忽略它的作用,因此check約束並不起作用(mariadb 支援)


18. gpu 加速SQL

PGSQL
可以使用gpu 加速SQL的執行速度   
 
 
MySQL

不支援gpu 加速SQL 的執行速度   


19. 數據類型

PGSQL
數據類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型欄位最大存儲1GB
 
 
MySQL

數據類型不夠豐富


20. 跨庫查詢

PGSQL
不支援跨庫查詢,這個跟Oracle 12C以前一樣
 
 
MySQL

可以跨庫查詢


21. 備份還原

PGSQL
備份還原非常簡單,時點還原操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)
假如有一個三節點的PGSQL主從集群,可以隨便在其中一個節點做完整備份和wal歸檔備份

 
 
MySQL

備份還原相對不太簡單,完整備份+binlog備份(增量)
完整備份需要percona的XtraBackup工具做物理備份,MySQL本身不支援物理備份
時點還原操作步驟繁瑣複雜


22. 性能視圖

PGSQL
需要安裝pg_stat_statements插件,pg_stat_statements插件提供了豐富的性能視圖:如:等待事件,系統統計資訊等
不好的地方是,安裝插件需要重啟資料庫,並且需要收集性能資訊的資料庫需要執行一個命令:create extension pg_stat_statements命令
否則不會收集任何性能資訊,比較麻煩

 
MySQL

自帶PS庫,默認很多功能沒有打開,而且打開PS庫的性能視圖功能對性能有影響(如:記憶體佔用導致OOM bug)


23. 安裝方式

PGSQL
有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進位包,一般用源碼編譯安裝,安裝時間會長一些,執行命令多一些

 
MySQL

有各個平台的包rpm包,deb包等等,源碼編譯安裝、二進位包安裝,一般用二進位包安裝,方便快捷


24. DDL操作

PGSQL
加欄位、可變長欄位類型長度改大不會鎖表,所有的DDL操作都不需要藉助第三方工具

 
MySQL

由於大部分DDL操作都會鎖表,例如加欄位、可變長欄位類型長度改大,所以需要藉助percona-toolkit裡面的pt-online-schema-change工具去完成操作
將影響減少到最低,特別是對大表進行DDL操作


25. 大版本發布速度

PGSQL
PGSQL每年一個大版本發布,大版本發布的第二年就可以上生產環境,版本迭代速度很快
PGSQL 10正式版推出時間:2017年
PGSQL 11正式版推出時間:2018年
PGSQL 12正式版推出時間:2019年
 
MySQL

MySQL的大版本發布一般是2年~3年,一般大版本發布後的第二年才可以上生產環境,避免有坑,版本發布速度比較慢

MySQL5.6正式版推出時間:2013年
MySQL5.7正式版推出時間:2015年
MySQL8.0正式版推出時間:2018年


26. returning語法

PGSQL
支援returning語法,returning clause 支援 DML 返回 Resultset,減少一次 Client <-> DB Server 交互

 
MySQL

不支援returning語法


27. 內部架構

PGSQL
多進程架構,並發連接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁記憶體

 
MySQL

多執行緒架構,雖然多執行緒架構,但是官方有限制連接數,原因是系統的並發度是有限的,執行緒數太多,反而系統的處理能力下降,隨著連接數上升,反而性能下降
一般同時只能處理200 ~300個資料庫連接


28. 聚集索引

PGSQL
不支援聚集索引,PGSQL本身的MVCC的實現機制所導致

 
MySQL

支援聚集索引


29. 空閑事務終結功能

PGSQL
通過設置 idle_in_transaction_session_timeout 參數來終止空閑事務,比如:應用程式碼中忘記關閉已開啟的事務,PGSQL會自動查殺這種類型的會話事務

 
MySQL

不支援終止空閑事務功能


30. 應付超大數據量

PGSQL
不能應付超大數據量,由於PGSQL本身的MVCC設計問題,需要垃圾回收,只能期待後面的大版本做優化   

 
MySQL

不能應付超大數據量,MySQL自身架構的問題


31. 分散式演進

PGSQL
HTAP資料庫:cockroachDB、騰訊Tbase
分片集群:  Postgres-XC、Postgres-XL

 

MySQL
HTAP資料庫:TiDB
分片集群: 各種各樣的中間件,不一一列舉


 

 

小結

上面的對比表還不是很完善,只有一些本人認為比較關鍵的特性拿出來對比

 

總的來說,MySQL因為需要支援更換存儲引擎,所以某些功能都要受制於存儲引擎層,例如:物理複製

而PGSQL不支援更換存儲引擎(在PGSQL V12開始也支援可插撥的表存取介面),而且一直由官方統一開發和維護,所以相對比較穩定,功能也比較完善,對得上它的稱號:《世界上功能最為強大的開源資料庫》

PGSQL V12 支援可插撥的表存取介面之後,有可能由第三方存儲引擎來改進PGSQL本身的MVCC實現機制,而不需要等待官方去解決,聚集索引、undo表空間這些都不再是問題

 

 

如有不對的地方,歡迎大家拍磚o(∩_∩)o 

本文版權歸作者所有,未經作者同意不得轉載。

運維了MySQL和PGSQL已經有一段時間了,最近接到一個資料庫選型需求,於是便開始收集資料整理了一下,然後就有了下面的對比表

關鍵詞:PostgreSQL 11、MySQL5.7

 

比較版本:PostgreSQL 11    VS      MySQL5.7(innodb引擎) Oracle官方社區版

版權情況:PostgreSQL 11(免費開源)、MySQL5.7 Oracle官方社區版(免費開源)


1. CPU限制

PGSQL

沒有CPU核心數限制,有多少CPU核就用多少

 

 

MySQL

能用128核CPU,超過128核用不上


 2. 配置文件參數

PGSQL
一共有255個參數,用到的大概是80個,參數比較穩定,用上個大版本配置文件也可以啟動當前大版本資料庫
 
 
MySQL
一共有707個參數,用到的大概是180個,參數不斷增加,就算小版本也會增加參數,大版本之間會有部分參數不兼容情況

3. 第三方工具依賴情況

PGSQL
只有高可用集群需要依靠第三方中間件,例如:patroni+etcd、repmgr
 
 
MySQL
大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,學習成本高,高可用集群也需要第三方中間件,官方MGR集群還沒成熟

4. 底層主從複製原理

PGSQL
物理複製,跟SQL Server鏡像/AlwaysOn一樣,嚴格一致,沒有任何可能導致不一致,性能和可靠性上,物理複製完勝邏輯複製,維護簡單   
 
 
MySQL
邏輯複製,(sql_log_bin、binlog_format等參數設置不正確都會導致主從不一致)
大事務並行複製效率低,對於重要業務,需要依賴 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比較和修復主從一致
主從複製出錯嚴重時候需要重搭主從
MySQL的邏輯複製並不阻止兩個不一致的資料庫建立複製關係

5. 從庫只讀狀態

PGSQL
系統自動設置從庫默認只讀,不需要人工介入,維護簡單   
 
 
MySQL
從庫需要手動設置參數super_read_only=on,讓從庫設置為只讀,super_read_only參數有bug,鏈接:https://baijiahao.baidu.com/s?id=1636644783594388753&wfr=spider&for=pc

6. 版本分支

PGSQL
只有社區版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社區版有所有功能,不像SQL Server和MySQL有標準版、企業版、經典版、社區版、開發版、web版之分
中國外還有一些基於PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些只是二次開發並不算獨立分支
 
 
MySQL
由於歷史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不兼容
Oracle官方分支還有版本之分,分為標準版、企業版、經典版、社區版

7. SQL特性支援

PGSQL
SQL特性支援情況支援94種,SQL語法支援最完善,例如:支援公用表表達式(WITH查詢)
 
 
MySQL
SQL特性支援情況支援36種,SQL語法支援比較弱,例如:不支援公用表表達式(WITH查詢)
 

PGSQL

一共有255個參數,用到的大概是80個,參數比較穩定,用上個大版本配置文件也可以啟動當前大版本資料庫

 

 

MySQL

一共有707個參數,用到的大概是180個,參數不斷增加,就算小版本也會增加參數,大版本之間會有部分參數不兼容情況

PGSQL

只有高可用集群需要依靠第三方中間件,例如:patroni+etcd、repmgr

 

 

MySQL

大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,學習成本高,高可用集群也需要第三方中間件,官方MGR集群還沒成熟

PGSQL

物理複製,跟SQL Server鏡像/AlwaysOn一樣,嚴格一致,沒有任何可能導致不一致,性能和可靠性上,物理複製完勝邏輯複製,維護簡單   

 

 

MySQL

邏輯複製,(sql_log_bin、binlog_format等參數設置不正確都會導致主從不一致)
大事務並行複製效率低,對於重要業務,需要依賴 percona-toolkit的pt-table-checksum和pt-table-sync工具定期比較和修復主從一致
主從複製出錯嚴重時候需要重搭主從
MySQL的邏輯複製並不阻止兩個不一致的資料庫建立複製關係

PGSQL

系統自動設置從庫默認只讀,不需要人工介入,維護簡單   

 

 

MySQL

從庫需要手動設置參數super_read_only=on,讓從庫設置為只讀,super_read_only參數有bug,鏈接:https://baijiahao.baidu.com/s?id=1636644783594388753&wfr=spider&for=pc

PGSQL

只有社區版,沒有其他任何分支版本,PGSQL官方統一開發,統一維護,社區版有所有功能,不像SQL Server和MySQL有標準版、企業版、經典版、社區版、開發版、web版之分
中國外還有一些基於PGSQL做二次開發的資料庫廠商,例如:Enterprise DB、瀚高資料庫等等,當然這些只是二次開發並不算獨立分支

 

 

MySQL

由於歷史原因,分裂為三個分支版本,MariaDB分支、Percona分支 、Oracle官方分支,發展到目前為止各個分支基本互相不兼容
Oracle官方分支還有版本之分,分為標準版、企業版、經典版、社區版

PGSQL

SQL特性支援情況支援94種,SQL語法支援最完善,例如:支援公用表表達式(WITH查詢)

 

 

MySQL

SQL特性支援情況支援36種,SQL語法支援比較弱,例如:不支援公用表表達式(WITH查詢)

 

關於SQL特性支援情況的對比,可以參考:http://www.sql-workbench.net/dbms_comparison.html


8. 主從複製安全性

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

9. 多欄位統計資訊

PGSQL
支援多欄位統計資訊
 
 
MySQL
不支援多欄位統計資訊

10. 索引類型

PGSQL
多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)
 
 
MySQL

btree 索引,全文索引(低效),表達式索引(需要建虛擬列),hash 索引只在記憶體表


11. 物理表連接演算法

PGSQL
支援  nested-loop join 、hash join 、merge join   
 
 
MySQL

只支援  nested-loop join


12. 子查詢和視圖性能

PGSQL
子查詢,視圖優化,性能比較高
 
 
MySQL

視圖謂詞條件下推限制多,子查詢上拉限制多


13. 執行計劃即時編譯

PGSQL
支援  JIT    執行計劃即時編譯,使用LLVM編譯器
 
 
MySQL

不支援執行計劃即時編譯


14. 並行查詢

PGSQL
並行查詢(多種並行查詢優化方法),並行查詢一般多見於商業資料庫,是重量級功能
 
 
MySQL

有限,只支援主鍵並行查詢


15. 物化視圖

PGSQL
支援物化視圖
 
 
MySQL

不支援物化視圖


16. 插件功能

PGSQL
支援插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等
 
 
MySQL

不支援插件功能


17. check約束

PGSQL
支援check約束
 
 
MySQL

不支援check約束,可以寫check約束,但存儲引擎會忽略它的作用,因此check約束並不起作用(mariadb 支援)


18. gpu 加速SQL

PGSQL
可以使用gpu 加速SQL的執行速度   
 
 
MySQL

不支援gpu 加速SQL 的執行速度   


19. 數據類型

PGSQL
數據類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型欄位最大存儲1GB
 
 
MySQL

數據類型不夠豐富


20. 跨庫查詢

PGSQL
不支援跨庫查詢,這個跟Oracle 12C以前一樣
 
 
MySQL

可以跨庫查詢


21. 備份還原

PGSQL
備份還原非常簡單,時點還原操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)
假如有一個三節點的PGSQL主從集群,可以隨便在其中一個節點做完整備份和wal歸檔備份

 
 
MySQL

備份還原相對不太簡單,完整備份+binlog備份(增量)
完整備份需要percona的XtraBackup工具做物理備份,MySQL本身不支援物理備份
時點還原操作步驟繁瑣複雜


22. 性能視圖

PGSQL
需要安裝pg_stat_statements插件,pg_stat_statements插件提供了豐富的性能視圖:如:等待事件,系統統計資訊等
不好的地方是,安裝插件需要重啟資料庫,並且需要收集性能資訊的資料庫需要執行一個命令:create extension pg_stat_statements命令
否則不會收集任何性能資訊,比較麻煩

 
MySQL

自帶PS庫,默認很多功能沒有打開,而且打開PS庫的性能視圖功能對性能有影響(如:記憶體佔用導致OOM bug)


23. 安裝方式

PGSQL
有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進位包,一般用源碼編譯安裝,安裝時間會長一些,執行命令多一些

 
MySQL

有各個平台的包rpm包,deb包等等,源碼編譯安裝、二進位包安裝,一般用二進位包安裝,方便快捷


24. DDL操作

PGSQL
加欄位、可變長欄位類型長度改大不會鎖表,所有的DDL操作都不需要藉助第三方工具

 
MySQL

由於大部分DDL操作都會鎖表,例如加欄位、可變長欄位類型長度改大,所以需要藉助percona-toolkit裡面的pt-online-schema-change工具去完成操作
將影響減少到最低,特別是對大表進行DDL操作


25. 大版本發布速度

PGSQL
PGSQL每年一個大版本發布,大版本發布的第二年就可以上生產環境,版本迭代速度很快
PGSQL 10正式版推出時間:2017年
PGSQL 11正式版推出時間:2018年
PGSQL 12正式版推出時間:2019年
 
MySQL

MySQL的大版本發布一般是2年~3年,一般大版本發布後的第二年才可以上生產環境,避免有坑,版本發布速度比較慢

MySQL5.6正式版推出時間:2013年
MySQL5.7正式版推出時間:2015年
MySQL8.0正式版推出時間:2018年


26. returning語法

PGSQL
支援returning語法,returning clause 支援 DML 返回 Resultset,減少一次 Client <-> DB Server 交互

 
MySQL

不支援returning語法


27. 內部架構

PGSQL
多進程架構,並發連接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁記憶體

 
MySQL

多執行緒架構,雖然多執行緒架構,但是官方有限制連接數,原因是系統的並發度是有限的,執行緒數太多,反而系統的處理能力下降,隨著連接數上升,反而性能下降
一般同時只能處理200 ~300個資料庫連接


28. 聚集索引

PGSQL
不支援聚集索引,PGSQL本身的MVCC的實現機制所導致

 
MySQL

支援聚集索引


29. 空閑事務終結功能

PGSQL
通過設置 idle_in_transaction_session_timeout 參數來終止空閑事務,比如:應用程式碼中忘記關閉已開啟的事務,PGSQL會自動查殺這種類型的會話事務

 
MySQL

不支援終止空閑事務功能


30. 應付超大數據量

PGSQL
不能應付超大數據量,由於PGSQL本身的MVCC設計問題,需要垃圾回收,只能期待後面的大版本做優化   

 
MySQL

不能應付超大數據量,MySQL自身架構的問題


31. 分散式演進

PGSQL
HTAP資料庫:cockroachDB、騰訊Tbase
分片集群:  Postgres-XC、Postgres-XL

 

MySQL
HTAP資料庫:TiDB
分片集群: 各種各樣的中間件,不一一列舉


 

 

小結

上面的對比表還不是很完善,只有一些本人認為比較關鍵的特性拿出來對比

 

總的來說,MySQL因為需要支援更換存儲引擎,所以某些功能都要受制於存儲引擎層,例如:物理複製

而PGSQL不支援更換存儲引擎(在PGSQL V12開始也支援可插撥的表存取介面),而且一直由官方統一開發和維護,所以相對比較穩定,功能也比較完善,對得上它的稱號:《世界上功能最為強大的開源資料庫》

PGSQL V12 支援可插撥的表存取介面之後,有可能由第三方存儲引擎來改進PGSQL本身的MVCC實現機制,而不需要等待官方去解決,聚集索引、undo表空間這些都不再是問題

 

 

如有不對的地方,歡迎大家拍磚o(∩_∩)o 

本文版權歸作者所有,未經作者同意不得轉載。

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

支援多欄位統計資訊

 

 

MySQL

不支援多欄位統計資訊

PGSQL

多種索引類型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表達式索引)

 

 

MySQL

PGSQL

支援  nested-loop join 、hash join 、merge join   

 

 

MySQL

PGSQL

子查詢,視圖優化,性能比較高

 

 

MySQL

PGSQL

支援  JIT    執行計劃即時編譯,使用LLVM編譯器

 

 

MySQL

PGSQL

並行查詢(多種並行查詢優化方法),並行查詢一般多見於商業資料庫,是重量級功能

 

 

MySQL

PGSQL

支援物化視圖

 

 

MySQL

PGSQL

支援插件功能,可以豐富PGSQL的功能,GIS地理插件,時序資料庫插件, 向量化執行插件等等

 

 

MySQL

PGSQL

支援check約束

 

 

MySQL

PGSQL

可以使用gpu 加速SQL的執行速度   

 

 

MySQL

PGSQL

數據類型豐富,如 ltree,hstore,數組類型,ip類型,text類型,有了text類型不再需要varchar,text類型欄位最大存儲1GB

 

 

MySQL

PGSQL

不支援跨庫查詢,這個跟Oracle 12C以前一樣

 

 

MySQL

PGSQL

備份還原非常簡單,時點還原操作比SQL Server還要簡單,完整備份+wal歸檔備份(增量)
假如有一個三節點的PGSQL主從集群,可以隨便在其中一個節點做完整備份和wal歸檔備份

 

 

MySQL

PGSQL

需要安裝pg_stat_statements插件,pg_stat_statements插件提供了豐富的性能視圖:如:等待事件,系統統計資訊等
不好的地方是,安裝插件需要重啟資料庫,並且需要收集性能資訊的資料庫需要執行一個命令:create extension pg_stat_statements命令
否則不會收集任何性能資訊,比較麻煩

 

MySQL

PGSQL

有各個平台的包rpm包,deb包等等,相比MySQL缺少了二進位包,一般用源碼編譯安裝,安裝時間會長一些,執行命令多一些

 

MySQL

PGSQL

加欄位、可變長欄位類型長度改大不會鎖表,所有的DDL操作都不需要藉助第三方工具

 

MySQL

PGSQL

PGSQL每年一個大版本發布,大版本發布的第二年就可以上生產環境,版本迭代速度很快

PGSQL 10正式版推出時間:2017年
PGSQL 11正式版推出時間:2018年
PGSQL 12正式版推出時間:2019年

 

MySQL

PGSQL

支援returning語法,returning clause 支援 DML 返回 Resultset,減少一次 Client <-> DB Server 交互

 

MySQL

PGSQL

多進程架構,並發連接數不能太多,跟Oracle一樣,既然跟Oracle一樣,那麼很多優化方法也是相通的,例如:開啟大頁記憶體

 

MySQL

PGSQL

不支援聚集索引,PGSQL本身的MVCC的實現機制所導致

 

MySQL

PGSQL

通過設置 idle_in_transaction_session_timeout 參數來終止空閑事務,比如:應用程式碼中忘記關閉已開啟的事務,PGSQL會自動查殺這種類型的會話事務

 

MySQL

PGSQL

不能應付超大數據量,由於PGSQL本身的MVCC設計問題,需要垃圾回收,只能期待後面的大版本做優化   

 

MySQL

PGSQL

HTAP資料庫:cockroachDB、騰訊Tbase

分片集群:  Postgres-XC、Postgres-XL