天天看點

PostgreSQL修煉之道:從小工到專家. 1.2 PostgreSQL資料庫與其他資料庫的對比

<b>1.2 postgresql資料庫與其他資料庫的對比</b>

<b>1.2.1postgresql與mysql資料庫的對比</b>

可能有人會問,既然已經有一個人氣很高的開源資料庫mysql了,為什麼還要使用postgresql?這主要是因為在一些應用場景中,使用mysql有以下幾個缺點:

功能不夠強大:mysql的多表連接配接查詢方式隻支援“nest loop”,不支援“hash join”和“sort merge join”。不僅如此,還有很多sql文法它也不支援,子查詢性能比較低。由于它不支援sequence,有公司還為此專門開發了統一序号分發中心的軟體。

性能優化工具和度量資訊不足:mysql在運作過程中如果出現問題,隻産生很少的性能資料,很難讓維護人員準确定位問題産生的原因。mysql的複制是異步的,無法通過master/slave做到資料零丢失。一些第三方公司也有改造mysql源代碼實作同步複制,但這些方案要麼是沒有開源,要麼已開源卻又不是很穩定,是以,對于普通大衆來說,如何實作同步複制成了一個令人頭疼的問題。

線上操作功能較弱:如果在mysql表中加列,基本上是建立一個表,而且建索引時也會鎖定整張表,即在建索引的過程中,表不能做任何操作。一些大的網際網路公司或者是修改mysql源碼來實作線上ddl的功能,或者是通過上層架構來解決這個問題,如先在slave資料庫上把ddl做完,然後把應用從master庫切換到slave,再把原先的master上把ddl做完。第一種方法,需要公司有很強的mysql研發能力,第二種方法需要公司有較強的開發能力,能設計出較強的應用架構。這對于一些中小型公司來說不太容易實作。

相對這些mysql的弱點,postgresql有以下幾個優點:

postgresql功能強大:支援所有主流的多表連接配接查詢的方式(如:“nest loop”、“ hash join”“sort merge join”等);支援絕大多數的sql文法(如:with子句)。postgresql是筆者見過的對正規表達式支援最強、内置函數也是最豐富的資料庫。字段類型還支援數組類型。除了可以使用pl/pgsql寫存儲過程外,還可以使用各種主流開發語言的文法(如:python語言的pl/python、perl語言的pl/perl來寫存儲過程)。這些強大的功能可以大大地節約開發資源。很多開發人員在postgresql上做開發時,會發現資料庫已幫自己實作了很多功能,甚至有一些業務功能都可直接使用資料庫的功能解決,不再需要寫代碼來實作了。

性能優化工具與度量資訊豐富:postgresql資料庫中有大量的性能視圖,可友善地定位問題(比如:可看到正在執行的sql,可通過鎖視圖看到誰在等待、哪條記錄被鎖定等)。postgresql中設計了專門的架構和程序用于收集性能資料,既有實體i/o方面的統計,也有表掃描及索引掃描方面的性能資料。

線上操作功能好:postgresql增加空值的列時,本質上隻是在系統表上把列定義上,無須對實體結構做更新,這就讓postgresql在加列時可以做到瞬間完成。postgresql還支援線上建索引的功能,建索引的過程可以不鎖更新操作。

從postgresql9.1開始,支援同步複制功能(synchronous replication),通過master和slave之間的複制可以實作零資料丢失的高可用方案。

另外,由于mysql對sql文法支援的功能較弱,基本上不适合做資料倉庫。雖然也有些廠商開發了基于mysql的資料倉庫存儲引擎(如infobright),但這個方案隻是解決了部分資料倉庫的問題,sql功能弱的問題仍無法完全解決。另外,infobright的社群版本功能上還有很多的限制,如不支援資料更新,不支援太多的并發執行(最多支援十幾個)等。而postgresql不僅支援複雜的sql,還支援大量的分析函數,非常适合做資料倉庫。

postgresql資料庫中還有一些支援移動網際網路時代的新功能,如空間索引。postgis是最著名的一個開源gis系統,它是postgresql中的一個插件,通過它可以很友善地解決lbs中的一些位置計算問題。

綜上所述,postgresql資料庫是一個功能強大,又帶有移動網際網路特征的開源資料庫。如果你僅僅是想把資料庫作為一個簡單的存儲功能使用(如一些大的網際網路公司),一些較複雜的功能都想放在應用中來實作,那麼選擇mysql或一些nosql産品都是合适的;如果你應用的資料通路很簡單(如大多數的blog系統),那麼後端使用mysql也是很合适的。但如果你的應用不像blog系統那麼簡單,而你又不想消耗太多的開發資源,那麼postgresql是一個明智的選擇。最有說服力的例子就是圖檔分享公司instagram,在使用python+postgresql架構後,隻是十幾個人就支援起了整個公司的業務。在資料庫中使用postgresql的感覺,就像在開發語言中使用python,會讓你的工作變得簡潔和高效。

<b>1.2.2 postgresql與oracle資料庫的對比</b>

從功能上說,postgresql要比oracle資料庫稍弱,如不支援索引組織表等。畢竟oracle資料庫是目前功能最強大的商業資料庫,但postgresql算是功能最強大的開源資料庫。

postgresql與oracle有很多相似之處:都是使用共享記憶體的程序結構,用戶端與資料庫伺服器建立一個連接配接後,資料庫伺服器就啟動一個程序為這個連接配接服務,這與mysql的線程模型不一樣。此外,postgresql的wal日志與oracle的redo日志都是記錄實體塊資料變化的,這與mysql的binlog也不同。

postgresql與oracle的不同之處在于:postgresql有更多的支援網際網路特征的功能。如postgresql資料類型支援網絡位址類型、xml類型、json類型、uuid類型,以及數組類型,有強大的正規表達式函數,where條件中可以使用正規表達式比對,可以使用python、perl等語言寫存儲過程等。

另外,postgresql更小巧。oracle安裝包動則幾個gb以上,postgresql安裝包隻有幾十mb大小。在任何一個環境都可以容易地安裝postgresql。