天天看點

MySQL與PostgreSQL比較,哪個更好、我們該選用哪個?

1.問題

如果打算為項目選擇一款免費、開源的資料庫,那麼你可能會在MySQL與PostgreSQL之間猶豫不定。MySQL與PostgreSQL都是免費、開源、強大、且功能豐富的資料庫。你主要的問題可能是:哪一個才是最好的開源資料庫,MySQL還是PostgreSQL呢?該選擇哪一個開源資料庫呢?

在選擇資料庫時,你所做的是個長期的決策,因為後面如果再改變決定将是非常困難且代價高昂的。你希望一開始就選擇正确。兩個流行的開源資料庫MySQL與PostgreSQL常常成為最後要選擇的産品。對這兩個開源資料庫的高層次概覽将會有助于你選擇最适合自己需要的。

2、MySQL

MySQL相對來說比較年輕,首度出現在1994年。它聲稱自己是最流行的開源資料庫。MySQL就是LAMP(用于Web開發的軟體包,包括 Linux、Apache及Perl/PHP/Python)中的M。建構在LAMP棧之上的大多數應用都會使用MySQL,包括那些知名的應用,如 WordPress、Drupal、Zend及phpBB等。

一開始,MySQL的設計目标是成為一個快速的Web伺服器後端,使用快速的索引序列通路方法(ISAM),不支援ACID。經過早期快速的發展之 後,MySQL開始支援更多的存儲引擎,并通過InnoDB引擎實作了ACID。MySQL還支援其他存儲引擎,提供了臨時表的功能(使用MEMORY存 儲引擎),通過MyISAM引擎實作了高速讀的資料庫,此外還有其他的核心存儲引擎與第三方引擎。

MySQL的文檔非常豐富,有很多品質不錯的免費參考手冊、圖書與線上文檔,還有來自于Oracle和第三方廠商的教育訓練與支援。

MySQL近幾年經曆了所有權的變更和一些頗具戲劇性的事件。它最初是由MySQL AB開發的,然後在2008年以10億美金的價格賣給了Sun公司,Sun公司又在2010年被Oracle收購。Oracle支援MySQL的多個版 本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費下載下傳的,另外一 些則是收費的。其核心代碼基于GPL許可,對于那些不想使用GPL許可的開發者與廠商來說還有商業許可可供使用。

現在,基于最初的MySQL代碼還有更多的資料庫可供選擇,因為幾個核心的MySQL開發者已經釋出了MySQL分支。最初的MySQL建立者之一 Michael “Monty” Widenius貌似後悔将MySQL賣給了Sun公司,于是又開發了他自己的MySQL分支MariaDB,它是免費的,基于GPL許可。知名的 MySQL開發者Brian Aker所建立的分支Drizzle對其進行了大量的改寫,特别針對多CPU、雲、網絡應用與高并發進行了優化。

3.PostgreSQL

PostgreSQL标榜自己是世界上最先進的開源資料庫。PostgreSQL的一些粉絲說它能與Oracle相媲美,而且沒有那麼昂貴的價格和傲慢的客服。它擁有很長的曆史,最初是1985年在加利福尼亞大學伯克利分校開發的,作為Ingres資料庫的後繼。

PostgreSQL是完全由社群驅動的開源項目,由全世界超過1000名貢獻者所維護。它提供了單個完整功能的版本,而不像MySQL那樣提供了 多個不同的社群版、商業版與企業版。PostgreSQL基于自由的BSD/MIT許可,組織可以使用、複制、修改和重新分發代碼,隻需要提供一個版權聲明即可。

可靠性是PostgreSQL的最高優先級。它以堅如磐石的品質和良好的工程化而聞名,支援高事務、任務關鍵型應用。PostgreSQL的文檔非 常精良,提供了大量免費的線上手冊,還針對舊版本提供了歸檔的參考手冊。PostgreSQL的社群支援是非常棒的,還有來自于獨立廠商的商業支援。

資料一緻性與完整性也是PostgreSQL的高優先級特性。PostgreSQL是完全支援ACID特性的,它對于資料庫通路提供了強大的安全性 保證,充分利用了企業安全工具,如Kerberos與OpenSSL等。你可以定義自己的檢查,根據自己的業務規則確定資料品質。

在衆多的管理特性 中,point-in-time recovery(PITR)是非常棒的特性,這是個靈活的高可用特性,提供了諸如針對失敗恢複建立熱備份以及快照與恢複的能力。但這并不是 PostgreSQL的全部,項目還提供了幾個方法來管理PostgreSQL以實作高可用、負載均衡與複制等,這樣你就可以使用适合自己特定需求的功能了。

4.平台

MySQL與PostgreSQL都出現在一些高流量的Web站點上:

  • MySQL:Slashdot、Twitter、Facebook與Wikipedia
  • PostgreSQL:Yahoo使用了一個修改的PostgreSQL資料庫來處理每天數以億計的事件,還有Reddit和Disqus

MySQL與PostgreSQL都能運作在多個作業系統上,如Linux、Unix、Mac OS X與Windows。他們都是開源、免費的,是以測試他們時的唯一代價就是你的時間與硬體。他們都很靈活且具有可伸縮性,可用在小型系統和大型分布式系統 上。

MySQL在一個領域上要比PostgreSQL更進一步,那就是它的觸角延伸到了嵌入式領域,這是通過libmysqld實作的。PostgreSQL不支援嵌入式應用,依然堅守在傳統的用戶端/伺服器架構上。

MySQL通常被認為是針對網站與應用的快速資料庫後端,能夠進行快速的讀取和大量的查詢操作,不過在複雜特性與資料完整性檢查方面不太盡如人意。

PostgreSQL是針對事務型企業應用的嚴肅、功能完善的資料庫,支援強ACID特性和很多資料完整性檢查。他們二者都在某些任務上具有很快的速 度,MySQL不同存儲引擎的行為有較大差别。

MyISAM引擎是最快的,因為它隻執行很少的資料完整性檢查,适合于後端讀操作較多的站點,不過對于包含 敏感資料的讀/寫資料庫來說就是個災難了,因為MyISAM表最終可能會損壞。MySQL提供了修複MySQL表的工具,不過對于敏感資料來說,支援 ACID特性的InnoDB則是個更好的選擇。

與之相反,PostgreSQL則是個隻有單一存儲引擎的完全內建的資料庫。你可以通過調整postgresql.conf檔案的參數來改進性能,也可以調整查詢與事務。PostgreSQL文檔對于性能調優提供了非常詳盡的介紹。

MySQL與PostgreSQL都是高可配置的,并且可以針對不同的任務進行相應的優化。他們都支援通過擴充來添加額外的功能。

一個常見的誤解就是MySQL要比PostgreSQL更容易學習。關系資料庫系統都是非常複雜的,這兩個資料庫的學習曲線其實是差不多的。

5.标準相容性

PostgreSQL旨在實作SQL相容性(目前标準是ANSI-SQL:2008)。MySQL則相容大部分SQL,不過還有自己的擴充,可以支 持NoSQL特性,這在參考手冊中都有介紹。每種方式都有優缺點。相容标準會讓資料庫管理者、資料庫開發者與應用開發者更舒服一些,因為這意味着他們隻需 學習一套标準、一套特性和指令即可。這會節省時間,提升效率,也不會被鎖定在特定的廠商上。

支援使用非标準的自定義功能的人們認為這樣可以快速采用新的特性,而不必等待标準程序完成。ANSI/ISO标準在不斷演化,是以标準相容性也是個 變化的目标:知名的關系型資料庫Microsoft SQL Server、Oracle與IBM DB2也隻是部分相容于标準。

6.結論

雖然有不同的曆史、引擎與工具,不過并沒有明确的參考能夠表明這兩個資料庫哪一個能夠适用于所有情況。很多組織喜歡使用PostgreSQL,因為 它的可靠性好,在保護資料方面很擅長,而且是個社群項目,不會陷入廠商的牢籠之中。

MySQL更加靈活,提供了更多選項來針對不同的任務進行裁剪。很多時 候,對于一個組織來說,對某個軟體使用的熟練程度要比特性上的原因更重要。

一.PostgreSQL相對于MySQL的優勢

  1. 在SQL的标準實作上要比MySQL完善,而且功能實作比較嚴謹;
  2. 存儲過程的功能支援要比MySQL好,具備本地緩存執行計劃的能力;
  3. 對表連接配接支援較完整,優化器的功能較完整,支援的索引類型很多,複雜查詢能力較強;
  4. PG主表采用堆表存放,MySQL采用索引組織表,能夠支援比MySQL更大的資料量。
  5. PG的主備複制屬于實體複制,相對于MySQL基于binlog的邏輯複制,資料的一緻性更加可靠,複制性能更高,對主機性能的影響也更小。
  6. MySQL的存儲引擎插件化機制,存在鎖機制複雜影響并發的問題,而PG不存在。

二、MySQL相對于PG的優勢:

  1. innodb的基于復原段實作的MVCC機制,相對PG新老資料一起存放的基于XID的MVCC機制,是占優的。新老資料一起存放,需要定時觸 發VACUUM,會帶來多餘的IO和資料庫對象加鎖開銷,引起資料庫整體的并發能力下降。而且VACUUM清理不及時,還可能會引發資料膨脹;
  2. MySQL采用索引組織表,這種存儲方式非常适合基于主鍵比對的查詢、删改操作,但是對表結構設計存在限制;
  3. MySQL的優化器較簡單,系統表、運算符、資料類型的實作都很精簡,非常适合簡單的查詢操作;
  4. MySQL分區表的實作要優于PG的基于繼承表的分區實作,主要展現在分區個數達到上千上萬後的處理性能差異較大。
  5. MySQL的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了innodb适合事務處理場景外,myisam适合靜态資料的查詢場景。

三、總結

開源資料庫都不是很完善,商業資料庫oracle在架構和功能方面都還是完善很多的。從應用場景來說,PG更加适合嚴格的企業應用場景(比如金融、電信、ERP、CRM),而MySQL更加适合業務邏輯相對簡單、資料可靠性要求較低的網際網路場景(比如google、facebook、alibaba)。

MySQL 與 PostgreSQL 比較,選哪個

為了弄明白PostgreSQL和MySQL的差别,我搜尋了關鍵字:MySQL vs PostgreSQL,并看了第一頁的幾個文章。以下是簡單總結:

MySQL與PostgreSQL的差別

MySQL是應用開發者建立出來的DBMS;而PostgreSQL是由資料庫開發者建立出來的DBMS 。換句話說,MySQL傾向于使用者的角度,回答的問題是 “你想解決的是什麼問題”;而PostgreSQL傾向于理論角度,回答的問題是 “資料庫應該如何來解決問題” 。

MySQL一般會将資料合法性驗證交給客戶;PostgreSQL在合法性難方面做得比較嚴格。比如MySQL裡插入 “2012-02-30” 這個時間時,會成功,但結果會是 “0000-00-00”;PostgreSQL不允許插入此值。

通常,PostgreSQL 被認為特性豐富,而MySQL被認為速度更快。但這個觀點基本是在 MySQL 4.x / PostgreSQL 7.x 的事情,現在情況已經變了,PostgreSQL 在9.x版本速度上有了很大的改進,而MySQL特性也在增加。

在架構上,MySQL分為兩層:上層的SQL層和幾個存儲引擎(比如InnoDB,MyISAM)。PostgreSQL 隻有一個存儲引擎提供這兩個功能。

這兩個資料庫系統都可以針對應用的情境被優化、定制,精确的說哪個性能更好很難。MySQL項目一開始焦點就在速度上,而PostgreSQL一開始焦點在特性和規範标準上。選哪個?