當前位置: 妍妍網 > 碼農

為何在國內MySQL成為主流,PG只能屈居二線?

2024-03-11碼農

最近,小編在知乎上看到這樣一個問題:

PostgreSQL也很強大,為何在中 國大陸MySQL成為主流,PostgreSQL屈居二線呢?

PostgreSQL能否替代MySQL?我感覺PostgreSQL非常強大,很多地方超過了MySQL。

舉幾個例子:

1.豐富的數據類,支持陣列、字典、json、序列號

2.強大的審計函式

3.強大的索引,易於sql調優

PostgreSQL在許多地方,有MySQL無法比擬的優勢。 但是在中國大陸,許多公司的核心業務庫,都是MySQL,PostgreSQL則屈居二線,作為審計類的資料庫來使用。

為什麽不讓PostgreSQL來扛大梁呢,而要用MySQL,PostgreSQL不合適麽?

MySQL和 PostgreSQL在功能上各有千秋,為什麽沒能在業界中形成「平分天下」的局面呢? 小編精選了幾位知乎網友的精彩回答,分享給大家學習交流(仁者見仁,智者見智,勿引戰~)



1號知乎網友:大寬寬




以下均為個人感覺,沒做過統計,就當個參考吧。

MySQL和Postgres的早期完全是兩個極端。MySQL更像是個「基本上滿足關聯式資料庫語法的大號KV」,對關系型資料庫的高級功能支持得很不好。我入行時接觸的MySQL 5.1和MyISAM儲存引擎,不支持ACID,但有如下幾點在當時的互聯網公司看來是非常合適:

1. 互聯網公司為了擴充套件,長期的經驗是, 僅僅把資料庫當作是一個「儲存」 ,而非儲存+核心數據邏輯的計算節點。大量的計算都在業務伺服器上進行,而業務伺服器可以無限水平擴充套件,無需擔心有狀態的數據遷移問題;

2. 因為沒有提供很多高級功能和數據一致性的保障,MySQL對於簡單的sql支持的反而更加直接,在 速度上有很大的優勢

3. 對於OLTP,完全不需要復雜的數據處理功能 。簡單的select ... from ... where id = xxx; insert into xxx;update xxx set xxx=xxx where id = xxxx是OLTP的主流功能。基於這些功能的ORM的出現大大提高了生產效率;對於OLAP,盡管Postgres查詢分析功能很強,但是一般互聯網公司的數據量實在太大,用Postgres這種資料庫根本無法處理。通常會用MapReduce、Hive、Pig等大數據處理工具來分析;

4. 多執行緒模型,天然對高並行支持良好 。而pg一直是多行程模型。行程的建立會更慢,更耗記憶體。雖然有些PG的連線池方案,但是MySQL在這方面「開箱即用」;

5. Postgres早期並不支持「邏輯復制」。 物理復制意味著儲存格式的細節完全暴露,不相容的版本無法直接組成主從同步,於是 無法做捲動升級 。這就意味著在升級資料庫時,必須停服,把整個集群升級後再恢復。而MySQL從一開始就是邏輯復制(這其實是由於MySQL一直是server和儲存引擎分層的架構,邏輯復制發生在server層)。這個缺陷會讓Postgres的營運不受業務開發者的待見。誰也不希望自己的業務停服。

反過來再看Postgres的優點,會發現對於OLTP並沒有太大的吸重力:

1. 豐富的數據型別: 通常用處不大,常用型別足夠了。如果有復雜型別,業務上自己序列化,儲存成varchar就行。可以用json,PB,avro等。序列化反序列化都發生在業務伺服器,更好維護和最佳化;

2. 強大的審計函式: 互聯網早期活下來是一切,審計並不是核心需求(通常需要嚴格審計的領域早就會用Oracle/msSQL,不差錢);

3. 強大的索引: Postgres的自訂索引功能很強大。但是對於MySQL,關鍵的幾列有索引就夠了,不需要復雜的高級索引。我承認早期MySQL的查詢最佳化器智商堪憂,但如果要改,一句explain,然後force index也就是了,對於開發人員簡單直接。有一段時間LBS很流行,當時MongoDB很潮地直接支持了空間索引。當時大家紛紛「NoSQL」,就更不會看Postgres一眼。然後到了大概2015年,MySQL 5.7也支持空間索引了。

4. Posgres的MVCC實作 牛不?牛。serial snapshot isolation是很強,但是到了需要變更數據嚴格一致的時候,select ... for update又不是不能用:)

5. 對於序列號,sequence是很好。 但是互聯網公司對於簡單場景用auto increment,對於生產場景就直接用分布式序列號生成服務了。Postgres的序列號產生器~偏雞肋。

6. Postgres的全文索引很強 ,但強得過ES?強得過專門客製的搜尋引擎系統?要知道搜尋業務最關鍵的是把「最匹配搜尋人需要的搜尋結果返回出來」,而不是僅僅「能搜到一堆不分主次但滿足關鍵字匹配的結果」。

因此早期MySQL變成了事實上的互聯網企業OLTP的事實標準。不管幹啥業務,MySQL都不可或缺。在行業裏跳槽來跳槽去的程式設計師普遍對MySQL也更熟悉。大量圍繞MySQL的商業服務都成為了行業主流。新一代分布式資料庫,像TiDB為了吸引使用者,首先要做的是「相容MySQL的語法」。

再往後,MySQL增加了更多「關系型資料庫該有的」功能,比如完全支持ACID的innodb成為預設儲存引擎,比如5.7的json原生支持,8.0的window function/CTE。而Postgres也增加了更多的「互聯網功能」,但是時機已經過去了。大家MySQL跑著業務好好的,而切換資料庫絕對不是僅僅像某些ORM標榜的換一個Dialect就行的,整個編程模型,效能表現,運維工具和流程都要有巨大的變化。如非必要,犯不著為了一個「most advanced」的標語去折騰,更不會為了資料庫愛好者的情懷做傷害利益的事情。


2號知乎網友: 羅詩亞




我已經不寫程式碼、做技術管理一段時間了,但是有些支持工程師做技術選型的經驗,根據業務上的需求來聊一聊吧。這裏一半是我們技術選型時TL告訴我的,一半是我個人程式碼實踐的經驗。

資料庫這種早期用了就基本不能換的東西是有滯後性的,你看到 現在MySQL的現狀,是「5年前MySQL是國內幾乎唯一選擇」造成的情況 。5年前Postgres就已經在歐美初創計畫裏比較受歡迎了,國內公司數據量、體量是國外公司無法比的,畢竟使用者人數多,隨便都上億,而且國外這幾年新計畫活得好的公司都是B2B,有幾十萬上百萬使用者量就很不錯了。

Postgres 有scaling issue (擴充套件問題?這個詞中文怎麽說),一個表2-3T就不行了,不做大量最佳化查詢速度就以秒開始做單位了,這是雲資料庫提供商不會告訴你的。他們只會告訴你Postgres的優點。題外話,NoSQL也有類似的壞處。但是除非在生產環境中踩過坑,沒有人會告訴你的。在技術社群裏噴某個解決方案不行是會被鄙視的,特別是大公司,有這種體量業務的工程師是沒時間跟你說這種掃興的話的。

Postgres的好處之一是有好幾年給新語言的ORM比MySQL成熟,對全棧工程師更友好。歐美的全棧工程師一般是手稿語言後端(Node、RoR、Python)加上前端。國內更流行的是強型別語言(Java)後端,一般不會同時前端的,Java + MySQL是真香。歐美這種全棧工程師的弱點就是對後端沒有那麽深的理解,這裏就不細聊了。

前幾年不需要運維支持就能部署的雲服務提供商(Digital Ocean、Heroku)只支持Postgres。同上,全棧工程師一般是沒有運維能力的。EC2上給你裝個MySQL?RDS的文件能看懂就很不錯了好嗎~

MySQL對於你說的那些Postgres優點,都在國內有業界已經驗證過,實施經驗人數也很多的最佳解決方案。而且那些優點,是工程師做得爽而已,跟業務沒啥實質性的關系。而踩過Postgres坑的這種人招不到,才是阻礙業務的第一大要素。

最後,為什麽都是data類才用PG,因為data不是業務組,運維支持力度沒那麽大,也沒有即時效能上的壓力,上面的壞處不是什麽壞處,好處卻是可見的,能夠提高開發速度的。

寫得不對的請勿噴,哈哈。


3號知乎網友: 靈劍




這可能還真的跟PHP有點關系 ,PHP很早的版本就有內建的mysql支持,很多Linux發行版都可以一鍵安裝LAMP套件(Apache + MySQL + PHP),基本不用配置就可以開始用。其實國內PHP流行的時候已經有pgsql的支持了,但是習慣和早期沿襲的資料的影響仍然是巨大的。因為MySQL用得多,自然熟悉MySQL的DBA也多,熟悉pgsql的DBA少,也就進一步影響了其它語言的選型。

對於當時的大部份開發者和公司來說,PGSQL的那些高級功能反正也不會用,自然就跟不存在沒什麽兩樣。


4號知乎網友: 聿明leslie




說說鄙人的見解。

從技術而言,PG 功能豐富 ,SQL 支持得很完備,強大的數據型別,嚴謹的關系模型,很難從關系模型去找出PG的不合理之處,多年積累,連全文索引詞庫都非常豐富,據說對於一些簡單的搜尋,都可以擺脫搜尋引擎了,最佳化器做得很好,在代價選擇上 PG 實作了基因演算法,這一點連Oracle 也沒有做到。

讀過一部份 PG 的程式碼和 MySQL 的程式碼,對比起來,PG 的程式碼寫得非常工整,註釋也很細致,真的可以稱得上code 教科書級別的工程,一定是一幫有情懷的coder 寫出來的,對比起來,MySQL 就是一坨……

可是 這個問題是一個工程性問題 ,就不要用這些方面來衡量一個工程問題!

歷史總是時勢造英雄,看看MySQL 火起來的那段時間,正是互聯網爆發式增長的那幾年。 由於PG 豐富的功能,所以它顯得太重了,多行程並行,再加上早期的儲存做得不夠好,太吃資源。 那個時代,記憶體和儲存都是比較昂貴的資源,早期的PG 效能也不太好,由於關系模型支持得很好,用起來會有諸多限制,學習成本會比較高。

比起這些, MySQL 要輕量很多,到現在這也是它的一個優點,在互聯網這個特定的場景中,大家為了追求快速叠代和拓展性 ,使用的 SQL 功能不會太多,都夠用。

而PG 由於更嚴謹的 SQL 關系模型,很多用法都限制得比較死,MySQL 卻要靈活很多,你的劣勢就出來了。 這個讓使用者用起來很爽,但是對於相容 MySQL 的相容實作者很痛苦;有些 feature 在特定的場景中用起很便利,但是在通用的模型中卻禁不起推敲,要不要相容它呢? 使用者很難感知 到這些,除非測試去亂試,一般人不會那麽無聊,這就是工程上的權衡。 很難說誰好誰壞。

而用的人多了,相關的使用經驗會匯總到社群,形成部署方案、工具等,這又是工程中的正反饋。

在江湖中,有幾個身負各項絕技的大俠最後成了將軍和皇帝的?


5號知乎網友: flaneur




感覺是 在幾個互聯網痛點的時間視窗沒趕上 ,蠻可惜的。

之前 uber 有一篇文章:Why Uber Engineering Switched from Postgres to MySQL( link.zhihu.com/?target=https://eng.uber.com/Postgres-to-MySQL-migration/

裏面提到的幾個問題現在我猜應該有解決,但是時間點晚了,比如:

  • 邏輯復制: 之前 uber 用的物理復制,master 上一個 bug 導致數據損壞一個 bit 寫錯了,所有的從跟著壞。

  • Replica 事務糙: 猜 Replica 的事務快照是怎麽實作的?開一個事務快照 == 停止主從復制。

  • 寫放大 + Replication 流量 放大: 與 MySQL 二級索引不同,Postgres 的索引指向的也是個物理位置,寫入數據時,即使索引的值未變化,也要更新索引指向的實體位址,存在一點寫放大,在物理復制的場景下,寫放大 == 流量放大。

  • 連線管理: Postgres 一個連線一個行程,這時候你才想起來執行緒竟然是個輕量的東西。

  • MySQL 給人的感覺就是「我啥都挫,要啥特 性沒啥特性,事務都用起來沒多少年,但是我十、二十年前就有主從邏輯復制跟 MHA」。

    "為何MySQL在大陸成為主流,PostgreSQL屈居二線呢?" 歡迎在留言區交流,留下你的觀點 ~


    整理丨dbaplus社群

    來源丨知乎:zhihu.com/question/31955622

    *僅為提供參考和學習交流,不代表dbaplus社群立場! dbaplus社群歡迎廣大技術人員投稿,投稿信箱:[email protected]