天天看點

如何選擇高速存儲、查詢資料庫

作者:方圓

連結:https://www.zhihu.com/question/20010554/answer/15863274

來源:知乎

著作權歸作者所有,轉載請聯系作者獲得授權。

一、 PostgreSQL 的穩定性極強, Innodb 等引擎在崩潰、斷電之類的災難場景下抗打擊能力有了長足進步,然而很多 MySQL 使用者都遇到過Server級的資料庫丢失的場景——mysql系統庫是MyISAM的,相比之下,PG資料庫這方面要好一些。

二、任何系統都有它的性能極限,在高并發讀寫,負載逼近極限下,PG的性能名額仍可以維持雙曲線甚至對數曲線,到頂峰之後不再下降,而 MySQL 明顯出現一個波峰後下滑(5.5版本之後,在企業級版本中有個插件可以改善很多,不過需要付費)。

三、PG 多年來在 GIS 領域處于優勢地位,因為它有豐富的幾何類型,實際上不止幾何類型,PG有大量字典、數組、bitmap 等資料類型,相比之下mysql就差很多,instagram就是因為PG的空間資料庫擴充POSTGIS遠遠強于MYSQL的my spatial而采用PGSQL的。

四、PG 的“無鎖定”特性非常突出,甚至包括 vacuum 這樣的整理資料空間的操作,這個和PGSQL的MVCC實作有關系。

五、PG 的可以使用函數和條件索引,這使得PG資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。

六、PG有極其強悍的 SQL 程式設計能力(9.x 圖靈完備,支援遞歸!),有非常豐富的統計函數和統計文法支援,比如分析函數(ORACLE的叫法,PG裡叫window函數),還可以用多種語言來寫存儲過程,對于R的支援也很好。這一點上MYSQL就差的很遠,很多分析功能都不支援,騰訊内部資料存儲主要是MYSQL,但是資料分析主要是HADOOP+PGSQL(聽李元佳說過,但是沒有驗證過)。

七、PG 的有多種叢集架構可以選擇,plproxy 可以支援語句級的鏡像或分片,slony 可以進行字段級的同步設定,standby 可以建構WAL檔案級或流式的讀寫分離叢集,同步頻率和叢集政策調整友善,操作非常簡單。

八、一般關系型資料庫的字元串有限定長度8k左右,無限長 TEXT 類型的功能受限,隻能作為外部大資料通路。而 PG 的 TEXT 類型可以直接通路,SQL文法内置正規表達式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔資料庫都可以省了。

九,對于WEB應用來說,複制的特性很重要,mysql到現在也是異步複制,pgsql可以做到同步,異步,半同步複制。還有mysql的同步是基于binlog複制,類似oracle golden gate,是基于stream的複制,做到同步很困難,這種方式更加适合異地複制,pgsql的複制基于wal,可以做到同步複制。同時,pgsql還提供stream複制。

十,pgsql對于numa架構的支援比mysql強一些,比MYSQL對于讀的性能更好一些,pgsql送出可以完全異步,而mysql的記憶體表不夠實用(因為表鎖的原因)

最後說一下我感覺 PG 不如 MySQL 的地方。

第一,MySQL有一些實用的運維支援,如 slow-query.log ,這個pg肯定可以定制出來,但是如果可以配置使用就更好了。

第二是mysql的innodb引擎,可以充分優化利用系統所有記憶體,超大記憶體下PG對記憶體使用的不那麼充分,

第三點,MySQL的複制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。

第四點,從測試結果上看,mysql 5.5的性能提升很大,單機性能強于pgsql,5.6應該會強更多.

第五點,對于web應用來說,mysql 5.6 的内置MC API功能很好用,PGSQL差一些。

另外一些:

pgsql和mysql都是背後有商業公司,而且都不是一個公司。大部分開發者,都是拿工資的。

說mysql的執行速度比pgsql快很多是不對的,速度接近,而且很多時候取決于你的配置。

對于存儲過程,函數,視圖之類的功能,現在兩個資料庫都可以支援了。

另外多線程架構和多程序架構之間沒有絕對的好壞,oracle在unix上是多程序架構,在windows上是多線程架構。

很多pg應用也是24/7的應用,比如skype. 最近幾個版本VACUUM基本不影響PGSQL 運作,8.0之後的PGSQL不需要cygwin就可以在windows上運作。

至于說對于事務的支援,mysql和pgsql都沒有問題。

它可以高效處理圖結構, 輕松實作 "朋友的朋友的朋友" 這種功能:

如何選擇高速存儲、查詢資料庫

開始做,堅持做,重複做