2018,為何你應該使用PostgreSQL,這幾個也許就是理由了
五年以前,我寫了一個《為何你應使用 PostgreSQL》的岾子,引起了廣泛的關注。一年以后,我增加了一些我漏寫的內(nèi)容,這些內(nèi)容我會在這篇文章的后半部分重述一下要點。但是在最近的 4-5 年,PostgreSQL 有了很多的改進和提高,也就有了更多的理由我們?yōu)楹我褂盟,F(xiàn)在這里是一個新的總結(jié),為何你應使用 PostgreSQL 這一特別棒的數(shù)據(jù)庫。
數(shù)據(jù)類型,包括 JSONB 和范圍(Range)類型
Postgres 一直以來對新增數(shù)據(jù)類型都是開放和友好的系統(tǒng)。 它有數(shù)組、空間地理以及很多時間相關的數(shù)據(jù)類型。幾年前它又增加了兩種值得我們關注和使用的新類型:
- JSONB 類型
JSONB 是一個二進制的 JSON 數(shù)據(jù)類型。它可以使用 GIN 和 GIST 格式進行索引。你也可以快速查詢完整的 JSON 文檔。
- Range 范圍類型
這個數(shù)據(jù)類型現(xiàn)在還沒有 JSONB 有名,范圍類型當它是你需要的類型時,它才會特別地有用。 對時間范圍來說,使用一列字段來表達從一個值到另一個值的范圍特別方便。如果你創(chuàng)建一個日歷應用,或者總是有一個從哪個時間到另一個時間的參數(shù),那范圍類型可以讓你只需使用一個字段值即可。更大的好處還有你可以指定一定的時間范圍不能相互覆蓋、交叉,或是其他對你的應用有用的約束。
Extensions 擴展功能
談到 Postgres 就很難不提到圍繞它存在的生態(tài)系統(tǒng)。擴展模塊的使用對社區(qū)來說很關鍵,同時也促使 Postgres 快速發(fā)展。擴展使用戶可以讓用戶使用原生的系統(tǒng)連接 Postgres 核心,而不必是將需求提交給 Postgres 的核心開發(fā)。這也意謂著用戶可以增加豐富的功能而不必與 Postgres 內(nèi)核的發(fā)布和審核循環(huán)連在一起。一些特別有名的重磅擴展有:
- Citus 擴展
Citus (這也是我工作的內(nèi)容) 擴展讓 Postgres 成為了一個分布式數(shù)據(jù)庫,它允許用戶很容易地將數(shù)據(jù)庫進行跨節(jié)點的分發(fā)。 而對你的應用來說,它仍然像是一個單節(jié)點的數(shù)據(jù)庫,而在后臺,Citus 會將數(shù)據(jù)傳給多個不同的物理設備和多個 Postgres 的實例。
- HyperLogLog 擴展
這是一個我個人最為喜歡的擴展,它允許用戶對大量數(shù)據(jù)的聚集的唯一計數(shù)有一個很容易獲得且非常接接近理論值的結(jié)果,當然也可以對跨時間聯(lián)合、相交等各種操作進行 處理。HyperLogLog 和其他的概要邏輯對處理大數(shù)據(jù)集和分布式數(shù)據(jù)庫很常用,并且是可以很方便地嵌入 Postgres 內(nèi)部使用。
- PostGIS 擴展
PostGIS 不是一個新的擴展,但它是一個值得重提亮點。它通常都是被認為是***進的地理數(shù)據(jù)庫。PostGIS 增加了新的高級的地理空間數(shù)據(jù)類型、操作符,使得很多與位置有關的地圖類或是路由類的操作變得很容易。
邏輯復制
多年以來,大家要求最多的就是解決 Postgres 中設置數(shù)據(jù)復制的易用性。最早時我們也有基本的復制方案,然后我們有了流復制技術(shù)(即二進制的 WAL 或稱之為預寫日志)。 對類似 wal-e 這樣的工具,幫助提升了 Postgres 在災難恢復方面的能力。
現(xiàn)在最近的版本里,我們有了邏輯復制,雖然現(xiàn)在還是需要一個擴展,不是 100% 內(nèi)核功能,但最終我們還是有了一個完整的邏輯復制方案。邏輯復制允許用戶發(fā)送不同數(shù)量的指令,這也意謂著我們可以復制指定的內(nèi)容或表。
系統(tǒng)擴展性
除了我們見到的 Postgres 在持續(xù)對功能和性能的改進,最近也是特別地增加了并行查詢功能以獲取更好的性能。如果用戶需要超出單個 Postgres 節(jié)點的擴展,我們可以使用前面提到的 Citus 進行橫向擴展。
豐富的索引
Postgres 現(xiàn)在有很多種強大的索引,像 GIN 和 GiST 索引,它們對 JSONB 數(shù)據(jù)特別有用。我們現(xiàn)在也有了 KNN 和 Sp-GiST 索引格式,并且還在增加中。
Upsert 功能
Upsert 在 Progress 已開發(fā)和演變有好幾年了。當然,一些用戶可以通過變通使用 CTE 功能來實現(xiàn)類似功能,但可能會產(chǎn)生一些條件沖突。這個特性曾是 MySQL 有但 Postgres 沒有的功能,現(xiàn)在 1 年多前,Postgres 也有了正式的支持。
外部數(shù)據(jù)源封裝
當然,還有幾年前就有的外部數(shù)據(jù)源封裝功能。它允許你映射外部數(shù)據(jù)系統(tǒng)至 Postgres 中的表。這就意謂著,比如,我們可以在 Postgres 中查詢 Redis 的數(shù)據(jù)庫。這項功能 5 年前就一直在不斷地改進和提高,尤其是現(xiàn)在我們已支持可寫的外部數(shù)據(jù)源處理,即我們在 Postgres 直接寫入數(shù)據(jù)至外部數(shù)據(jù)庫?,F(xiàn)在官方的 Postgres 發(fā)布版本中至少帶有 Postgres 的 FDW,它對跨 Postgres 實例讀寫數(shù)據(jù)尤其有用。
更多其他的功能
如果你對以前的 PG 版本不是太熟,在以前的版本中一些應了解的功能還包括:
- 窗口函數(shù)
- 一般函數(shù)
- 可定制的語言
- NoSQL 數(shù)據(jù)類型
- 定制函數(shù)
- CTE 表達式
- 并行索引創(chuàng)建
- 事務 DDL
- 外部數(shù)據(jù)封裝
- 條件或函數(shù)式索引
- 事件偵聽 / 提醒
- 表繼承
- 事務級的同步復制