postgresql很強大,為何在中國,mysql成為主流?


你找一個能安裝起來的數據庫,都可以學,不管什么版本。

數據庫的基本功,是那些基本概念(SQL,表,存儲過程,索引,鎖,連接配置等等),這些在任何一個版本中都是一樣的。

postgresql很強大,為何在中國大陸,mysql成為主流?

可以看相關的問題:為什么國內流行mybatis,國外反而多用hibernate?

1. https://www.zhihu.com/question/309662829

2. https://zhuanlan.zhihu.com/p/439807305

3. https://www.cnblogs.com/jpfss/p/10882139.html

時勢造英雄

  • 可能跟PHP有點關系

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

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

  • mysql和postgres的早期完全是兩個極端。

mysql更像是個“基本上滿足關系數據庫語法的大號“K V”,對關系型數據庫的高級功能支持的很不好。


為什么說PostgreSQL非常厲害?

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

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

  • 對於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等大數據處理工具來分析;

  • 多線程模型,天然對高並發支持良好。而pg一直是多進程模型。進程的創建會更慢,更耗內存。雖然有些pg的連接池方案,但是mysql在這方面“開箱即用”;

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

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

  1. 豐富的數據類型 - 通常用處不大,常用類型足夠了。如果有復雜類型,業務上自己序列化,存儲成varchar就行。可以用json,PB,avro等。序列化反序列化都發生在業務服務器,更好維護和優化;
  2. 強大的審計函數 - 互聯網早期活下來是一切,審計並不是核心需求(通常需要嚴格審計的領域早就會用Oracle/MSql,不差錢);
  3. 強大的索引。postgres的自定義索引功能很強大。但是對於mysql,關鍵的幾列有索引就夠了,不需要復雜的高級索引。我承認早期mysql的查詢優化器智商堪憂,但如果要改,一句explain,然后force index也就是了。對於開發人員簡單直接。有一段時間LBS很流行,當時mongo很潮的直接支持了空間索引。當時大家紛紛的“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"的標語去折騰,更不會為了數據庫愛好者的情懷做傷害利益的事情。

主流數據庫哪個最好?哪個現在最火?

商業Oracle,微軟SQLServer,免費MySQL。

也可以看一下這個數據庫排行榜 DB-Engines Ranking,可以看到關系數據庫數據庫中,上面三者的流行度遠抄其他數據庫。而非關系數據庫,比較流行的就是 MongoDB 和 Redis 了。

PostgreSQL,MongoDB,Redis上漲很猛,Oracle,MSSQL,少許下降,MySQL幾乎不變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM