PostgreSQL 資料庫的前世今生

內容摘要

PostgreSQL是以加州大學伯克利分校計算機系開發的 Posrgres,現在已經更名為PostgreSQL。它是一個自由的對象-關係資料庫伺服器(資料庫管理系統),它在靈活的 BSD-風格許可證下發行。PostgreSQL 中國社區發起人之一Digoal為我們帶來PostgreSQL 前世今生、社區理念以及阿里雲PostgreSQL內核優化。

本文內容來源於Digoal(德哥)PostgreSQL2016中國用戶大會(大象會)上的主題演講,IT大咖說為PostgreSQL 中國社區合作的視頻知識分享平台。

嘉賓演講視頻回顧及PPT: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 | 阿里云 |