作者:Zete鏈接:https://www.zhihu.com/question/20010554/answer/62628256來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。Pg 沒有 MySQL 的各種坑
MySQL 的各種 text 字段有不同的限制, 要手動區分 small text, middle text, large text... Pg 沒有這個限制, text 能支持各種大小.
按照 SQL 標準, 做 null 判斷不能用 = null, 只能用 is nullthe result of any arithmetic comparison with NULL is also NULL
但 pg 可以設置 transform_null_equals 把 = null 翻譯成 is null 避免踩坑
不少人應該遇到過 MySQL 里需要 utf8mb4 才能顯示 emoji 的坑, Pg 就沒這個坑.
MySQL 的事務隔離級別 repeatable read 并不能阻止常見的并發更新, 得加鎖才可以, 但悲觀鎖會影響性能, 手動實現樂觀鎖又復雜. 而 Pg 的列里有隱藏的樂觀鎖 version 字段, 默認的 repeatable read 級別就能保證并發更新的正確性, 并且又有樂觀鎖的性能. 附帶一個各數據庫對隔離級別的行為差異比較調查: http://www.cs.umb.edu/~poneil/iso.pdf**
MySQL 不支持多個表從同一個序列中取 id, 而 Pg 可以.
MySQL 不支持 OVER 子句, 而 Pg 支持. OVER 子句能簡單的解決 "每組取 top 5" 的這類問題.
幾乎任何數據庫的子查詢 (subquery) 性能都比 MySQL 好.
更多的坑:http://blog.ionelmc.ro/2014/12/28/terrible-choices-mysql/**
不少人踩完坑了, 以為換個數據庫還得踩一次, 所以很抗拒, 事實上不是!!!
Pg 不僅僅是 SQL 數據庫
它可以存儲 array 和 json, 可以在 array 和 json 上建索引, 甚至還能用表達式索引. 為了實現文檔數據庫的功能, 設計了 jsonb 的存儲結構. 有人會說為什么不用 Mongodb 的 BSON 呢? Pg 的開發團隊曾經考慮過, 但是他們看到 BSON 把 ["a", "b", "c"] 存成 {0: "a", 1: "b", 2: "c"} 的時候就決定要重新做一個 jsonb 了... 現在 jsonb 的性能已經優于 BSON.
現在往前端偏移的開發環境里, 用 Pg + PostgREST 直接生成后端 API 是非??焖俑咝У霓k法:begriffs/postgrest · GitHub**postgREST 的性能非常強悍, 一個原因就是 Pg 可以直接組織返回 json 的結果.
它支持服務器端腳本: TCL, Python, R, Perl, Ruby, MRuby ... 自帶 map-reduce 了.
它有地理信息處理擴展 (GIS 擴展不僅限于真實世界, 游戲里的地形什么的也可以), 可以用 Pg 搭尋路服務器和地圖服務器:PostGIS — Spatial and Geographic Objects for PostgreSQL**
它自帶全文搜索功能 (不用費勁再裝一個 elasticsearch 咯):Full text search in milliseconds with PostgreSQL** 不過一些語言相關的支持還不太完善, 有個 bamboo 插件用調教過的 mecab 做中文分詞, 如果要求比較高, 還是自己分了詞再存到 tsvector 比較好.
它支持 trigram 索引.trigram 索引可以幫助改進全文搜索的結果: PostgreSQL: Documentation: 9.3: pg_trgm**trigram 還可以實現高效的正則搜索 (原理參考 https://swtch.com/~rsc/regexp/regexp4.html** )
MySQL 處理樹狀回復的設計會很復雜, 而且需要寫很多代碼, 而 Pg 可以高效處理樹結構:Scaling Threaded Comments on Django at Disqus**http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures**
它可以高效處理圖結構, 輕松實現 "朋友的朋友的朋友" 這種功能:http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age**
它可以把 70 種外部數據源 (包括 Mysql, Oracle, CSV, hadoop ...) 當成自己數據庫中的表來查詢:
mysql和postgresql的區別
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- About:PostgreSQL About 《PostgreSQL 源碼分析系列》 PostgreSQL 源碼分...
- PostgreSQL 與 MySQL 相比,優勢何在? - 數據庫 - 知乎https://www.zhihu.c...
- 自媒體大V咪蒙,前兩天以《每一個職場媽媽,都欠孩子一句對不起》為標題,發布了一篇煽情的廣告軟文。 文章中舉了一個例...