PostgreSQL 資料庫的前世今生
內容摘要
PostgreSQL是以加州大學伯克利分校計算機系開發的 Posrgres,現在已經更名為PostgreSQL。它是一個自由的對象-關係資料庫伺服器(資料庫管理系統),它在靈活的 BSD-風格許可證下發行。PostgreSQL 中國社區發起人之一Digoal為我們帶來PostgreSQL 前世今生、社區理念以及阿里雲PostgreSQL內核優化。
本文內容來源於Digoal(德哥)在PostgreSQL2016中國用戶大會(大象會)上的主題演講,IT大咖說為PostgreSQL 中國社區合作的視頻知識分享平台。
嘉賓演講視頻回顧及PPT:http://t.cn/RQExjev
PostgreSQL前世今生
我在2015年加入了阿里雲,並在阿里巴巴內部推廣PostgreSQL。如果你原來使用的是那種相對較弱的其他資料庫,用了PostgreSQL之後你會發現,原來資料庫可以可以這麼強大。
PostgreSQL發展歷史
PostgreSQL在1973年還處於一個渾沌初開的年代,在那個年代大家並不了解資料庫。很不幸的是,在1982年的時候ingres就閉源了,走上了商業化的道路。
PostgreSQL真正誕生於二十世紀八十年代,它沿用了ingres很多的思想。到了1995年,兩位華人把PostgreSQL的SQL引擎改掉之後,正式社區化了。在1995年的時候它是一個「金蟬脫殼」的狀態。PostgreSQL從此誕生了。
版本迭代
從最初的版本PG95到現在,基本上它每年會發一個大的版本,每三個月左右可能會出一個小版本。我們今天所看到的已經release出來的最新版本是9.6的版本。
我會將整個PostgreSQL從誕生到9.6中間這些過程里的一些里程碑和大家分享一下。
7.2版本
PostGIS:
穿越回2002年,從這個版本開始就出現很多日常使用中會接觸到的一些特性。比如在02年的時候它已經支持GIS,到現在GIS在民用里已經非常廣泛了。這裡用得最多的是二維或是根據經緯度做一些距離的搜索。
但PG和其他誕生於互聯網的資料庫的地理位置信息處理不太一樣,它還做了像raster這種數據類型的處理,在軍工、科研的領域要求就比較高。
對於二維的類型,比如它支持點面判斷、支持距離的計算等等,這種運算在資料庫裡面都實現。所以說它的支持比較完備。
另外一個就是索引。對一個資料庫來說,真正的支持一個數據類型,除了能夠input、output,能夠支持計算之外,還需要加一個索引。
最後就是函數。能使用自己編寫的UDF或者內置的UDF去處理數據類型,這樣對一個資料庫來說才能夠真正稱得上支持這個數據類型。因此PostGIS在PostgreSQL裡面真正做到了一個對數據類型的支持。
8.4版本
窗口查詢-數據透視:
從2002年飛越到2009年,發布8.4版本的時候就已經支持窗口查詢。
比如根據學生的學號在不同窗口裡查它數據的屬性。要查省里排名第一的人,以及跟第一的人名次分值差別是多少。另外還有一個窗口,比如這個城市或者學校里又會有和那個窗口裡第一名的差距。如果說沒有語法支持的話,得跟資料庫交互很多次才能夠滿足業務上的需求。跟資料庫交互有很大開銷,所以在這一塊有窗口查詢功能是比較好的。
遞歸查詢-支持樹形結構數據:
另外一個就是遞歸查詢。比如要根據數據結構從某一個節點往上或往下推出來它對應的節點,使用遞歸查詢就可以很方便的來完成這個需求。
遞歸查詢:優化count(distinct)
遞歸查詢還有另外一個好處,它可以做一個收斂的查詢。在數據稀疏的情況下,利用遞歸查詢和直接count(distinct)的性能差異是非常大的。
並行恢復:
當時支持了邏輯層面的並行恢復。
9.0版本
非同步流複製:
在9.0的時候支持了非同步流複製,基本上可以做到毫秒級的延遲,跟網路環境當然也是息息相關的。同時它支持一組多備、支持備庫的read only。而且備庫的read only不會影響redo。最重要的一點是這種方式它是物理一致的,不是邏輯一致。因為邏輯上保證一致性還是有比較大的風險,比較容易出現主備不一致的問題。但是物理上基本上就不會有這樣的問題。
快速大版本升級:
把一個資料庫分為兩個數據的種類。一個是這個元數據,另外一個就是數據文件。大版本的升級實際上只需要把元數據拷貝到新的版本里去,數據文件不用拷過去,所以這個升級是很快的。
那麼最後是要做一個統計信息的重新收集。因為大版本的升級往往是統計信息的元數據有可能會變,統計信息會在新版本裡面失效,所以在新版本里就得重新去生成統計信息。生成統計信息的速度還是比較快的。
9.1版本
同步流複製:
9.1在流複製這一塊加了一個同步的功能,用戶可以根據事務可靠性要求,選擇本事務是否需要同步複製。
KNN查詢索引支持:
針對近鄰查詢做了一個索引的支持。比如要根據經緯度去查詢最近的用戶,或者根據數值查詢最相鄰數值,以及根據文本相似度查詢最相似文本。
像探探、陌陌這種應用里一個最核心的訴求,就是根據距離查詢用戶。
FDW介面:
在一家比較大的企業里,可能會用到很多資料庫的品種。現在有了FBW之後的話,對應用來說,它會更加輕鬆了。可以通過外部的訪問介面直接去透傳到遠端的資料庫。
9.2版本
GiST取代B-Tree用於範圍匹配查詢:
傳統B-Tree的查詢效率比較低,而GiST可以存一個範圍的數據類型,使用這個索引檢索,可以達到八萬TPS,性能提升非常明顯。
JSON支持:
JSON在9.2的時候僅支持數據的存取,同時能夠使用JavaScript語言處理數據類型,所以在9.2的時候JSON的支持是不完美的。
級聯複製:
在9.2的時候還推出了級聯複製。它的好處是提高了效率,減輕了負擔。
9.3版本
物化視圖:
9.3支持了物化視圖。假如要頻繁查詢某一份大數據里某些維度的數據,並且要帶上一些比較奇怪的條件。以往可能要在全範圍的數據裡面去做檢索,現在可以把它做成一個物化視圖,之後去這個物化視圖裡查詢數據。
可寫FDW:
FDW已經支持可寫了。現在不僅僅可以讀過來,還可以寫過去,這也為sharding打下了一個基礎。
事件觸發器:
9.3還有一個特性叫事件觸發器。它其實作用非常多,比如邏輯複製裡面的DDL無法複製,可能要做一些堵塞式的操作。使用事件觸發器的話,操作就比較方便。
另外它還有一個很好的作用,就是在企業裡面,DBA是很難控制的。通常我們是把DBA的行為記錄下來,但是不能避免它去做一些DDL的動作。那麼使用事件觸發器,它就能夠控制。這個其實是對DBA的一種保護。
9.4版本
JSONB:
JSONB是真正一個完備的支持,現在除了IO之外,還有了OP、AM、func來支持它。
它可以做任意KEY或者value的索引支持。
在value里它支持numeric、string、time、array等,包括常用的JSON類型查詢、構造符都支持。
多master複製:
多Master基於redo的邏輯複製,是9.4的一個新特性。
防止雪崩:
使用緩存預熱的插件可以抵禦雪崩效應,響應時間保持平穩。
高效(秒、毫秒級)模糊檢索、分詞:
PG支持和搜索引擎一樣的功能,即使前後都遮擋了,PostgreSQL也能把它查出來。
9.5版本
流式數據-塊級索引BRIN:
在物聯網裡有很多感測器,這些感測器會不停發數據上來,經常要處理和時間維度相關的數據。因此時間維度和存儲數據的線性相關性是很強的,在這種情況下就可以做塊級索引。
GIS數據結合窗口、多維分析:
避免了冗餘掃描和計算,每個大範圍的數據只需要掃一次;解決靈活多變的多維透視需求。
同時也解放了程序員的雙手,一次性統計出所有可能產生的維度。
9.6版本
並行計算-精準營銷:
加了基於CPU的並行計算之後,很多企業做報表的時候可以在PG里用上所有資源,就不需要把數據同步出去來處理。
金融級-多副本可靠性:
支持任意副本,提供了非常高的可靠性要求副本。
前端-任意維度勾選:
Bloom,gin,任意索引bitmap合併等技術解決任意列組合查詢的效率和彈性問題。
10版本
10版本預計2017金秋全新發布,敬請期待…
其它插件
GIS業務-最佳路徑計算
圖像搜索
基因測序
3D數據處理
一條SQL搞定聚類分析
線性回歸例子
機器學習UDF庫
一條SQL搞定流式實時處理
超輕鎖-秒殺特性
資料庫編程能力
估值計算
文本挖掘-相似度
物聯網-旋轉門壓縮
PostgreSQL社區理念
PostgreSQL將是繼ingres之後又一個改變世界的產品。
阿里雲PostgreSQL內核優化
阿里雲ApsaraDB for PostgreSQL正在努力將資料庫與其他雲產品實現更好的銜接和配合。通過oss_fdw插件,使得PostgreSQL可以和雲端對象存儲配合使用,將冷數據存入oss,實現冷熱分離和多實例數據共享。未來將與其他更多雲端組件進行銜接。
今天的分享就到這裡,謝謝大家!
推薦閱讀:
※PostgreSQL入門到精通——世界上功能最強大的開源資料庫
※PG(PostgreSQL)在一捅到底架構中的使用
※Vert.x裡面那些b格很高的玩意
※阿里雲RDS金融資料庫(三節點版)系列文章之背景、理論篇
TAG:数据库 | PostgreSQL | 阿里云 |