什么是PostgreSQL?跟MySQL、Oracle比强在哪?
導讀:本文主要給大家介紹什么是PostgreSQL數據庫、PostgreSQL有哪些強大的功能及其目前的一些應用情況,以便大家對PostgreSQL有一個初步的認識。
作者:唐成
來源:大數據DT(ID:hzdashuju)
01?什么是PostgreSQL
PostgreSQL數據庫是功能強大的開源數據庫,它支持豐富的數據類型(如JSON和JSONB類型、數組類型)和自定義類型。
PostgreSQL數據庫提供了豐富的接口,可以很方便地擴展它的功能,如可以在GiST框架下實現自己的索引類型,支持使用C語言寫自定義函數、觸發器,也支持使用流行的編程語言寫自定義函數。
PL/Perl提供了使用Perl語言寫自定義函數的功能,當然還有PL/Python、PL/Java、PL/Tcl等。
02?PostgreSQL數據庫的優勢
PostgreSQL數據庫具有以下優勢:
PostgreSQL數據庫是目前功能最強大的開源數據庫,它是最接近工業標準SQL92的查詢語言,至少實現了SQL:2011標準中要求的179項主要功能中的160項(注:目前沒有哪個數據庫管理系統能完全實現SQL:2011標準中的所有主要功能)。
穩定可靠:PostgreSQL是唯一能做到數據零丟失的開源數據庫。目前有報道稱國內外有部分銀行使用PostgreSQL數據庫。
開源省錢:?PostgreSQL數據庫是開源的、免費的,而且使用的是類BSD協議,在使用和二次開發上基本沒有限制。
支持廣泛:PostgreSQL 數據庫支持大量的主流開發語言,包括C、C++、Perl、Python、Java、Tcl以及PHP等。
PostgreSQL社區活躍:PostgreSQL基本上每3個月推出一個補丁版本,這意味著已知的Bug很快會被修復,有應用場景的需求也會及時得到響應。
03?PostgreSQL應用現狀和發展趨勢
PostgreSQL目前在國外很流行,特別是近幾年,使用PostgreSQL數據庫的公司越來越多。
日本電報電話公司(NTT)大量使用PostgreSQL替代Oracle數據庫,并且在 PostgreSQL之上二次開發了Postgres-XC,Postgres-XC是對使用者完全兼容PostgreSQL接口的share-nothing 架構的數據庫集群。
亞信科技(AsiaInfo)在Postgres-XC的基礎上開發了AntDB數據庫,AntDB是一款面向金融、電信、政務、安全、能源等行業的分布式事務型關系數據庫產品。它具備集群自動高可用、秒級在線擴縮容、異地容災、SQL語句級自定義分片、分布式事務和MVCC等功能,且具有強大的Oracle兼容性。AntDB完全兼容PostgreSQL數據庫。
騰訊在PosgreSQL-XC基礎上開發了TBase分布式數據庫。相較于Postgres-XC,其穩定性得到了較大提高,同時TBase通過在內核中創造性地引入 GROUP 概念,提出了雙Key分布策略,有效地解決了數據傾斜的問題;它根據數據的時間戳,將數據分為冷數據和熱數據,分別存儲于不同的存儲設備中,有效地解決了存儲成本的問題。
網絡電話公司Skype也大量使用了PostgreSQL,并貢獻了如下與PostgreSQL數據庫配套的開源軟件。
PL/Proxy:PostgreSQL中的數據水平拆分軟件。
pgQ:使用PostgreSQL的消息隊列軟件。
Londiste:用C語言實現的在PostgreSQL數據庫之間進行邏輯同步的軟件。
全球最大的CRM軟件服務提供商Salesforce也開始使用PostgreSQL,并招募了PostgreSQL內核開發者Tom lane。
著名的圖片分享網站Instagram也大量使用了PostgreSQL。
2012年,美國聯邦機構全面轉向PostgreSQL陣營;法國也正積極推動政府機構采用PostgreSQL數據庫來取代商業數據庫。
在國內,越來越多的公司開始使用PostgreSQL,如斯凱網絡的后臺數據庫使用的基本都是PostgreSQL數據庫,去哪兒網(qunar.com)和平安科技也大量地使用了PostgreSQL數據庫。
主流的云服務提供商如亞馬遜、阿里云、騰訊云、華為云也都提供了PostgreSQL的云數據庫服務。
更多關于PostgreSQL數據庫的現狀信息可見PostgreSQL官方網站:
http://www.postgresql.org/
04?PostgreSQL數據庫與其他數據庫的對比
本節主要介紹PostgreSQL數據庫與主流數據庫MySQL和Oracle的相同點和區別。
1.?PostgreSQL與MySQL數據庫的對比
可能有人會問,既然已經有一個人氣很高的開源數據庫MySQL了,為什么還要使用PostgreSQL?這主要是因為不同的數據庫有不同的特點,應該為合適場景選擇合適的數據庫。在一些應用場景中,使用MySQL有以下幾大缺點。
復雜SQL支持弱
在MySQL 8.0之前,多表連接查詢的方式只支持“Nest Loop”,不支持Hash JOIN和Sort Merge JOIN(注:MySQL8.0版本開始支持Hash JOIN,但不完善,有一些問題。
另因為MySQL無完善的基于COST的優化器(CBO),長期來說也會存在一定的問題),不僅如此,它對很多SQL語法都不支持,子查詢性能比較低。例如,MySQL不支持單獨的sequence,有公司為此還專門開發了統一序號分發中心的軟件。
性能優化工具與度量信息不足
如果MySQL在運行過程中出現問題,性能監控數據較少,維護人員要準確定位問題存在一定的困難。
MySQL的復制是異步或半同步的邏輯同步,這存在兩個問題
一是在大事務下會導致比較大的延遲;二是容易導致數據庫的不一致,原因是邏輯復制容易導致數據的不一致性,而MySQL的雙層日志會讓這個問題變得更復雜,即主備庫的復制是通過邏輯層的binlog來實現的,但在存儲引擎InnoDB下還有物理的Redo Log層,整個過程比較復雜,比較難保證主備庫之間完全一致。
由于有兩層日志(binlog日志和InnoDB的Redo日志),因此也很難做到Master/Slave在異常切換過程中的零數據丟失。一些第三方公司改造MySQL源代碼以實現同步復制,但這些方案要么是沒有開源,要么是已開源卻又不是很穩定,所以,對于普通用戶來說,如何實現零數據庫丟失的同步復制是一個令人頭疼的問題。
在線操作功能較弱
很多在線DDL需要重建表,代價很大,有一些操作還會鎖表。一些大的互聯網公司或者修改MySQL源碼來實現在線DDL功能,或者通過上層架構來解決這個問題,如先在Slave數據庫上把DDL做完,然后把應用從Master庫切換到Slave庫,再到原先的Master上把DDL做完。
對于第一種方法,需要公司有很強的MySQL研發能力,第二種方法則需要公司有較強的開發能力,能設計出較強的應用架構。這對于一些中小型公司來說不太容易實現。
難以寫插件來擴展MySQL的功能
雖然用UDF,或通過外部動態庫中的函數來擴展部分功能,但能擴展的功能很有限。如MySQL比較難訪問其他數據庫中的數據。
相對MySQL的這些弱點,PostgreSQL有以下幾個優點。
功能強大
支持所有主流的多表連接查詢的方式,如“Nest loop”“Hash JOIN”“Sort Merge JOIN”等;支持絕大多數的SQL語法,如CTE(MySQL8.0之前不支持CTE)。
PostgreSQL是筆者見過的對正則表達式支持最強、內置函數也是最豐富的數據庫。它的字段類型還支持數組類型。除了可以使用PL/PGSQL寫存儲過程外,還可以使用各種主流開發語言的語法(如Python語言的PL/Python、Perl語言的PL/Perl來寫存儲過程)。
這些強大的功能可以大大地節約開發資源。很多開發人員在PostgreSQL上做開發時,會發現數據庫已實現很多功能,甚至有一些業務功能都不再需要寫代碼來實現了,直接使用數據庫的功能即可解決問題。
性能優化工具與度量信息豐富
PostgreSQL數據庫中有大量的性能視圖,可以方便地定位問題(比如可以看到正在執行的SQL,可以通過鎖視圖看到誰在等待,以及哪條記錄被鎖定等)。PostgreSQL中設計了專門架構和進程用于收集性能數據,既有物理I/O方面的統計,也有表掃描及索引掃描方面的性能數據。
在線操作功能好
PostgreSQL增加空值列時,本質上只是在系統表上把列定義上,無須對物理結構做更新,這就讓PostgreSQL在加列時可以做到瞬間完成。PostgreSQL還支持在線建索引的功能,在創建索引的過程可以不鎖更新操作。
從PostgreSQL9.1開始,支持同步復制(synchronous replication)功能,通過Master和Slave之間的復制可以實現零數據丟失的高可用方案。
可以方便地寫插件來擴展PostgreSQL數據庫的功能
PostgreSQL提供了安裝、編寫插件的整體框架,如提供了create extension等SQL語句以方便地裝載插件;寫一個動態庫可以很方便地給PostgreSQL添加函數;提供了外部數據源(FDW)的框架和編程接口,根據此框架和編程接口可以方便地編寫訪問其他數據庫和外部數據源的插件。
現在針對已有的常見外部數據源,如Oracle、MySQL、SQL Server等數據庫都有了第三方插件,通過這些第三方插件可以在PostgreSQL數據庫中方便地訪問外部數據。另外,PostgreSQL還提供了鉤子函數的接口,可以實現更強大功能的插件,如pg_pathman分區表的插件、citus分庫分表的插件等。
另外,由于MySQL對SQL語法支持的功能較弱,基本上不適合做數據倉庫。雖然也有些廠商開發了MySQL數據倉庫的存儲引擎(如Infobright),但這個方案只是解決了部分數據倉庫的問題,SQL功能弱的問題還是無法完全解決。
而且Infobright的社區版本在功能上有很多限制,如不支持數據更新、不支持太多的并發執行(最多支持十幾個)等。而PostgreSQL不僅支持復雜的SQL,還支持大量的分析函數,非常適合做數據倉庫。
PostgreSQL數據庫中還有一些支持移動互聯網的新功能,如空間索引。PostGIS是最著名的一個開源GIS系統,它是PostgreSQL中的一個插件,在PostgreSQL中使用它很方便。通過PostGIS也可以很方便地解決LBS中的一些位置計算問題。
綜上所述,PostgreSQL數據庫是一個功能強大,又帶有移動互聯網特征的開源數據庫。
如果你僅僅是想把數據庫作為一個簡單的存儲軟件(一些大的互聯網公司就是這樣),一些較復雜的功能都想放在應用中來實現,那么選擇MySQL或一些NoSQL產品都是合適的。如果你應用的數據訪問很簡單(如大多數的博客系統),那么后端使用MySQL也是很合適的。
但是如果你的應用不像博客系統那么簡單,又不想消耗太多的開發資源,那么PostgreSQL是一個很明智的選擇。最有說服力的例子就是圖片分享公司Instagram,在使用“Python+PostgreSQL”架構后,只是十幾個人就支撐了整個公司的業務。
在數據庫中使用PostgreSQL的感覺就像在開發語言中使用Python,會讓你的工作變得簡潔和高效。
2.?PostgreSQL與Oracle數據庫的對比
從功能上說,PostgreSQL可以與Oracle數據庫媲美。Oracle數據庫是目前功能最強大的商業數據庫,PostgreSQL則是功能最強大的開源數據庫。Oracle在集群功能如RAC、ASM方面比較強,但PostgtreSQL也有一些比Oracle強的特性,如在索引和可擴展等方面。
PostgreSQL與Oracle有很多相似之處,它們都是使用共享內存的進程結構,客戶端與數據庫服務器建立一個連接后,數據庫服務器就啟動一個進程來為這個連接服務。這與MySQL的線程模型不一樣。
PostgreSQL與Oracle一樣,PostgreSQL的WAL日志與Oracle的Redo日志都是用于記錄物理塊數據的變化的,這與MySQL的binlog是不一樣的。
PostgreSQL在主備庫方面非常完善,可以搭建同步備庫、異步備庫、延遲備庫,在同步備庫中可以配置數據同步到任意個備庫上。只讀備庫在查詢與應用日志的沖突解決方面提供了更多的參數控制,讓DBA更容易控制只讀備庫的查詢沖突。在配置備庫的過程中,PostgreSQL比Oracle簡單很多,備庫的搭建也更靈活。
PostgreSQL與Oracle的不同之處在于,PostgreSQL有更多支持互聯網特征的功能。如PostgreSQL數據類型支持網絡地址類型、XML類型、JSON類型、UUID類型以及數組類型,且有強大的正則表達式函數,如where條件中可以使用正則表達式匹配,也可以使用Python、Perl等語言寫存儲過程等。
另外,PostgreSQL更小巧。PostgreSQL可以在內存很小的機器上完美運行起來,如在512MB的云主機中,而Oracle數據庫基本要在數GB的云主機中才可以運行起來。
Oracle安裝包動輒幾個GB以上級別,而PostgreSQL的安裝包只有幾十MB大小。PostgreSQL在任何一個環境都可以輕松地安裝。Oracle數據庫安裝花費的時間是在小時級別,而PostgreSQL在分鐘級別就可以完成安裝。
關于作者:唐成,擁有20多年的數據庫、操作系統、存儲領域的工作經驗。目前擔任中啟乘數科技CTO,從事高性能、高可靠、高可用的分布式數據庫的研究工作以及數據庫內核的開發工作。歷任過阿里巴巴的高級數據庫專家和網易杭州研究院開發專家。
本文摘編自《PostgreSQL修煉之道:從小工到專家》(第2版),經出版方授權發布。
延伸閱讀《PostgreSQL修煉之道:從小工到專家》
點擊上圖了解及購買
轉載請聯系微信:DoctorData
推薦語:PostgreSQL中國社區數據庫專家撰寫,PostgreSQL數據庫領域經典著作,第2版全面升級。
當當網計算機圖書每滿100-50!滿200-100!滿300-150!滿400-200!
機械工業出版社華章公司聯合當當網特意為大數據DT用戶申請了一批可與滿減疊加使用的“滿200減30”的圖書優惠碼,優惠碼使用后相當于:
花160買400的書?!!!
優惠碼(可選任意一個復制粘貼):
NATRUQ
KACR2F
使用時間:10/20-11/03
使用渠道:當當app和當當小程序
長按小程序碼去選書
劃重點????
干貨直達????
終于有人把數據中臺講明白了
NLP入門干貨:手把手教你3種中文規則分詞方法
吐血推薦:大數據、數據分析、人工智能…最新干貨資料全在這里了
金錢能讓人更快樂嗎?手把手教你用機器學習找到答案
更多精彩????
在公眾號對話框輸入以下關鍵詞
查看更多優質內容!
PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白?|?神操作
大數據?|?云計算?|?數據庫?|?Python?|?可視化
AI?|?人工智能?|?機器學習?|?深度學習?|?NLP
5G?|?中臺?|?用戶畫像?|?1024?|?數學?|?算法?|?數字孿生
據統計,99%的大咖都完成了這個神操作
????
總結
以上是生活随笔為你收集整理的什么是PostgreSQL?跟MySQL、Oracle比强在哪?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于有人把卷积神经网络(CNN)讲明白了
- 下一篇: 从起源到未来:能自己编程和改进的超人工智