postgresql和mysql的區別是什么

區別:1、PGSQL沒有CPU核心數限制,而mysql有限制;2、PGSQL的配置文件參數一共有255個,MySQL一共有707個;3、PGSQL支持多字段統計信息,而MySQL不支持;4、PGSQL支持執行計劃即時編譯,MySQL不支持。

postgresql和mysql的區別是什么

本教程操作環境:windows7系統、PostgreSQL 11&&MySQL5.7版本、Dell G3電腦。

PostgreSQL是一種特性非常齊全的自由軟件的對象-關系型數據庫管理系統(ORDBMS)。

postgresql和mysql的區別是什么

PostgreSQL支持大部分的SQL標準并且提供了很多其他現代特性,如復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制等。同樣,PostgreSQL也可以用許多方法擴展,例如通過增加新的數據類型、函數、操作符、聚集函數、索引方法、過程語言等。另外,因為許可證的靈活,任何人都可以以任何目的免費使用、修改和分發PostgreSQL。

postgresql和mysql的區別對比

比較版本: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特性支持

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

MySQLSQL特性支持情況支持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,部分索引,表達式索引)

MySQLbtree 索引,全文索引(低效),表達式索引(需要建虛擬列),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操作都不需要借助第三方工具,并且跟商業數據庫一樣,DDL操作可以回滾,保證事務一致性

MySQL由于大部分DDL操作都會鎖表,例如加字段、可變長字段類型長度改大,所以需要借助percona-toolkit里面的pt-online-schema-change工具去完成操作將影響減少到最低,特別是對大表進行DDL操作DDL操作不能回滾

25. 大版本發布速度

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

MySQLMySQL的大版本發布一般是2年~3年,一般大版本發布后的第二年才可以上生產環境,避免有坑,版本發布速度比較慢MySQL5.5正式版推出時間:2010年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. 分布式演進

PGSQLHTAP數據庫:cockroachDB、騰訊Tbase分片集群:Postgres-XC、Postgres-XLMySQLHTAP數據庫:TiDB分片集群:各種各樣的中間件,不一一列舉

32. 數據庫的文件名和命名規律

PGSQLPGSQL在這方面做的比較不好,DBA不能在操作系統層面(停庫狀態下)看清楚數據庫的文件名和命名規律,文件的數量,文件的大小一旦操作系統發生文件丟失或硬盤損壞,非常不利于恢復,因為連名字都不知道PGSQL表數據物理文件的命名/存放規律是:在一個表空間下面,如果沒有建表空間默認在默認表空間也就是base文件夾下,例如:/data/base/16454/3599base:默認表空間pg_default所在的物理文件夾16454:表所在數據庫的oid3599:就是表對象的oid,當然,一個表的大小超出1GB之后會再生成多個物理文件,還有表的fsm文件和vm文件,所以一個大表實際會有多個物理文件由于PGSQL的數據文件布局內容太多,大家可以查閱相關資料當然這也不能全怪PGSQL,作為一個DBA,時刻做好數據庫備份和容災才是正道,做介質恢復一般是萬不得已的情況下才會做

MySQL數據庫名就是文件夾名,數據庫文件夾下就是表數據文件,每個表都有對應的frm文件和ibd文件,存儲元數據和表/索引數據,清晰明了,做介質恢復或者表空間傳輸都很方便

33. 權限設計

PGSQLPGSQL在權限設計這塊是比較坑爹,拋開實例權限和表空間權限,PGSQL的權限層次有點像SQL Server,db=》schema=》object要說權限,這里要說一下Oracle,用Oracle來類比在ORACLE 12C之前,實例與數據庫是一對一,也就是說一個實例只能有一個數據庫,不像MySQL和SQL Server一個實例可以有多個數據庫,并且可以隨意跨庫查詢而PGSQL不能跨庫查詢的原因也是這樣,PGSQL允許建多個數據庫,跟ORACLE類比就是有多個實例(之前說的實例與數據庫是一對一)一個數據庫相當于一個實例,因為PGSQL允許有多個實例,所以PGSQL單實例不叫一個實例,叫集簇(cluster),集簇這個概念可以查閱PGSQL的相關資料PGSQL里面一個實例/數據庫下面的schema相當于數據庫,所以這個schema的概念對應MySQL的database注意點:正因為是一個數據庫相當于一個實例,PGSQL允許有多個實例/數據庫,所以數據庫之間是互相邏輯隔離的,導致的問題是,不能一次對一個PGSQL集簇下面的所有數據庫做操作必須要逐個逐個數據庫去操作,例如上面說到的安裝pg_stat_statements插件,如果您需要在PGSQL集簇下面的所有數據庫都做性能收集的話,需要逐個數據庫去執行加載命令又例如跨庫查詢需要dblink插件或fdw插件,兩個數據庫之間做查詢相當于兩個實例之間做查詢,已經跨越了實例了,所以需要dblink插件或fdw插件,所以道理非常簡單權限操作也是一樣逐個數據庫去操作,還有一個就是PGSQL雖然像SQL Server的權限層次結構db=》schema=》object,但是實際會比SQL Server要復雜一些,還有就是新建的表還要另外授權在PGSQL里面,角色和用戶是一樣的,對新手用戶來說有時候會傻傻分不清,也不知道怎么去用角色,所以PGSQL在權限設計這一塊確實比較坑爹

MySQL使用mysql庫下面的5個權限表去做權限映射,簡單清晰,唯一問題是缺少權限角色user表db表host表tables_priv表columns_priv表

34. 發展歷史

PGSQL在1995年,開發人員Andrew Yu和Jolly Chen在Postgres中添加了一個SQL(Structured Query Language,結構化查詢語言)翻譯程序,該版本叫做Postgres95,在開放源代碼社區發放。在1996年,再次對Postgres95做了較大的改動,并將其命名為PostgresSQL 6.0版發布,PostgresSQL 的名字就此定型,從1995年算起,大概有24年歷史

MySQL在1996年,MySQL 1.0發布,它只面向一小撥人,相當于內部發布。到了1996年10月,MySQL 3.11.1發布(MySQL沒有2.x版本),最開始只提供Solaris操作系統下的二進制版本,一個月后,Linux版本出現從1996年算起,大概有23年歷史

【相關推薦:mysql視頻教程

以上就是postgresql和

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享