為何使用 PostgreSQL

2021-08-13 22:09:42 字數 1915 閱讀 2386

五年以前,我寫了乙個《為何你應使用postgresql》的岾子,引起了廣泛的關注。一年以後,我增加了一些我漏寫的內容,這些內容我會在這篇文章的後半部分重述一下要點。但是在最近的4-5年,postgresql有了很多的改進和提高,也就有了更多的理由我們為何要使用它。現在這裡是乙個新的總結,為何你應使用postgresql這一忒棒的資料庫。

​postgres一直以來對新增資料型別都是開放和友好的系統。 它有陣列、空間地理以及很多時間相關的資料型別。幾年前它又增加了兩種值得我們關注和使用的新型別:

jsonb型別

jsonb 是乙個二進位制的json資料型別。它可以使用gin 和 gist格式進行索引。你也可以快速查詢完整的json 文件。

range範圍型別

這個資料型別現在還沒有jsonb有名,範圍型別當它是你需要的型別時,它才會特別地有用。 對時間範圍來說,使用一列欄位來表達從乙個值到另乙個值的範圍特別方便。如果你建立乙個日曆應用,或者總是有乙個從哪個時間到另乙個時間的引數,那範圍型別可以讓你只需使用乙個字段值即可。更大的好處還有你可以指定一定的時間範圍不能相互覆蓋、交叉,或是其他對你的應用有用的約束。

談到postgres就很難不提到圍繞它存在的生態系統。擴充套件模組的使用對社群來說很關鍵,同時也促使postgres快速發展。擴充套件使使用者可以讓使用者使用原生的系統連線postgres核心,而不必是將需求提交給postgres的核心開發。這也意謂著使用者可以增加豐富的功能而不必與postgres核心的發布和審核迴圈連在一起。一些特別有名的重磅擴充套件有:

citus擴充套件

citus (這也是我工作的內容) 擴充套件讓postgres成為了乙個分布式資料庫,它允許使用者很容易地將資料庫進行跨節點的分發。 而對你的應用來說,它仍然像是乙個單節點的資料庫,而在後台,citus會將資料傳給多個不同的物理裝置和多個postgres的例項。

hyperloglog擴充套件

postgis擴充套件

postgis不是乙個新的擴充套件,但它是乙個值得重提亮點。它通常都是被認為是最先進的地理資料庫。postgis增加了新的高階的地理空間資料型別、操作符,使得很多與位置有關的地圖類或是路由類的操作變得很容易。

多年以來,大家要求最多的就是解決postgres中設定資料複製的易用性。最早時我們也有基本的複製方案,然後我們有了流複製技術(即二進位制的wal或稱之為預寫日誌)。 對類似wal-e這樣的工具,幫助提公升了postgres在災難恢復方面的能力。

現在最近的版本裡,我們有了邏輯複製,雖然現在還是需要乙個擴充套件,不是100%核心功能,但最終我們還是有了乙個完整的邏輯複製方案。邏輯複製允許使用者傳送不同數量的指令,這也意謂著我們可以複製指定的內容或表。

除了我們見到的postgres在持續對功能和效能的改進,最近也是特別地增加了並行查詢功能以獲取更好的效能。如果使用者需要超出單個postgres節點的擴充套件,我們可以使用前面提到的citus進行橫向擴充套件。

postgres現在有很多種強大的索引,像gin 和gist索引,它們對jsonb資料特別有用。我們現在也有了knn 和sp-gist索引格式,並且還在增加中。

upsert在progress已開發和演變有好幾年了。當然,一些使用者可以通過變通使用cte功能來實現類似功能,但可能會產生一些條件衝突。這個特性曾是mysql有但postgres沒有的功能,現在1年多前,postgres也有了正式的支援。

當然,還有幾年前就有的外部資料來源封裝功能。它允許你對映外部資料系統至postgres中的表。這就意謂著,比如,我們可以在postgres中查詢redis的資料庫。這項功能5年前就一直在不斷地改進和提高,尤其是現在我們已支援可寫的外部資料來源處理,即我們在postgres直接寫入資料至外部資料庫。現在官方的postgres發布版本中至少帶有postgres的fdw,它對跨postgres例項讀寫資料尤其有用。

如果你對以前的pg版本不是太熟,在以前的版本中一些應了解的功能還包括:

PostgreSQL使用zhparser自定義分詞

zhparser是pg的乙個中文全文檢索外掛程式,它基於簡單中文分詞 scws 實現中文解析器。我們在使用zhparser時常常會遇到的乙個問題就是 我們想要分詞的詞語無法被識別。例如 bill select from ts parse zhparser 支付寶使用很方便 tokid token 1...

PostgreSQL使用大全

持續更新中 1.初始postgresql資料庫集群 initdb d datapath 使用該命令會建立乙個資料庫集群,用於管理多個資料庫,同時當初始化資料庫集群時,會建立共享的表,同時會建立template1和postgres兩個資料庫。對於template1資料庫,是資料庫的模板,當我們新建立資...

為何使用Ansible

b size large it 自動化 size b 現在市面上用一些實現it自動化的工具,例如 puppet,chef,salt。ansible 是乙個相對比較新的工具,但目前社群十分活躍。我用過puppet和ansible。這裡想討論一下我偏愛ansible的原因。b size large 架構...