PostgreSQL與MySQL技術(shù)選型
數(shù)據(jù)本質(zhì)上只是不同事實和觀察結(jié)果的集合。隨著時間的推移,開發(fā)人員意識到管理數(shù)據(jù)不僅僅是一個可選的跟蹤系統(tǒng),而是隨著世界通過互聯(lián)網(wǎng)逐漸變得更加緊密聯(lián)系而變得必不可少。
如今,企業(yè)利用數(shù)據(jù)來分析潛在客戶、實現(xiàn)他們的潛力、降低風險等。
隨著全球數(shù)據(jù)量的增加,對能幫助更有效地管理數(shù)據(jù)的強大靈活的數(shù)據(jù)庫的需求不斷增加。本文將研究 WordPress 最常用的兩個開源數(shù)據(jù)庫及其區(qū)別:PostgreSQL 與 MySQL。
什么是 WordPress 數(shù)據(jù)庫?
不少企業(yè)使用 WordPress 來托管他們的網(wǎng)站,占互聯(lián)網(wǎng)上所有網(wǎng)站的 43%!除此之外,它約占所有已部署內(nèi)容管理系統(tǒng) (CMS) 的 60%。其易于使用的布局使其成為初學者的完美選擇。雖然使用 WordPress 不需要事先具備編碼知識,但它確實有助于理解數(shù)據(jù)庫。
沒有WordPress 數(shù)據(jù)庫,您的網(wǎng)站將無法運行。數(shù)據(jù)庫系統(tǒng)本質(zhì)上是您網(wǎng)站的支柱。它確保一切都被跟蹤,從您博客上的內(nèi)容到不同用戶所做的評論和更改。它甚至增強了網(wǎng)站的加載和執(zhí)行能力。
理想的數(shù)據(jù)庫應該是靈活的、成本友好的和可擴展的。WordPress 數(shù)據(jù)庫有很多,我們現(xiàn)在只討論 PostgreSQL 和 MySQL。
什么是 PostgreSQL?
PostgreSQL是一種開源的對象關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它完全符合 SQL 標準,并且功能豐富。它還是可擴展的,對任何需要企業(yè)工具的人都很有用。它專為提高效率而設計,幾乎可以集成到任何軟件中。
PostgreSQL 是面向?qū)ο蟮模梢詳U展數(shù)據(jù)類型以創(chuàng)建您的自定義類型,并且它支持幾乎所有數(shù)據(jù)庫。本節(jié)將詳細介紹其歷史、功能和用例。
歷史
40 年前,年輕的開拓者、Ingres 項目組組長 Michael Stonebraker 離開伯克利,去開發(fā)專有版本的 Ingres。然后他回到伯克利并發(fā)起了一個后 Ingres 項目,該項目解決了當時其他數(shù)據(jù)庫遇到的幾個問題。
那個項目就是 PostgreSQL 。該項目配備了支持多種“對象關(guān)系”數(shù)據(jù)類型所需的多項功能,包括支持在表之間保持一致關(guān)系的規(guī)則以及跨服務器的數(shù)據(jù)復制。PostgreSQL 的第一個版本于 1997 年 1 月 29 日形成 6.0 版。從那時起,開發(fā)人員、支持公司和志愿者都可以在其免費和開放許可下繼續(xù)維護數(shù)據(jù)庫軟件。
主要特點
PostgreSQL 作為數(shù)據(jù)庫管理系統(tǒng)可以提供很多功能。它以功能穩(wěn)健性、高可靠性、性能、靈活性和易于復制而著稱。
讓我們看看是什么讓 PostgreSQL 成為您企業(yè)不可或缺的工具。
高度可靠
PostgreSQL 支持多種語言的外鍵、存儲過程、連接和視圖。它包括各種數(shù)據(jù)類型,支持大對象的存儲,包括圖片、聲音和視頻。由于它是開源的,它得到了開發(fā)人員的支持,他們通過定期嘗試查找錯誤和改進軟件來提供無與倫比的維護系統(tǒng)。
通過預寫日志記錄功能,它還具有容錯性,支持在線備份和基于指定時間點恢復。并可以通過安裝以前的物理備份數(shù)據(jù)庫來支持恢復到 WAL 數(shù)據(jù)覆蓋的任何時刻。
此外,“物理備份”不需要是數(shù)據(jù)庫狀態(tài)的即時快照。如果它是過去創(chuàng)建的,則重放該特定時間的 WAL 日志即可解決數(shù)據(jù)不一致問題。
靈活性
PostgreSQL 是開源的,因此可以免費使用代碼進行跨平臺修改。它可以適用于任何平臺,包括 Windows、Solaris、OS X 和 Linux。除此之外,它可以同時容納多個用戶,阻止同一行的并發(fā)更新。
可擴展性
可擴展性是一種軟件工程原則。PostgreSQL 提供高可擴展性,因為它的操作是目錄驅(qū)動的,即信息存儲在數(shù)據(jù)庫、列、表等中。表達式即時 (JIT) 編譯使支持不同的編程語言編寫代碼,而無需重新編譯代碼數(shù)據(jù)庫并定義數(shù)據(jù)類型。這種自發(fā)修改任何操作的能力特別適合快速實施新的存儲結(jié)構(gòu)和應用程序。
復制
PostgreSQL 包括內(nèi)置的同步復制,它確保主節(jié)點會等待每次寫入,直到復制節(jié)點將數(shù)據(jù)寫入其事務日志。事務的持久性可以按數(shù)據(jù)庫、會話和用戶不同級別指定,有助于提高速度,因為它不需要確認事務是否正在到達同步備用庫,尤其是當某些流程不需要這些保證時。
用例
PostgreSQL 幾乎無處不在,它位居當今最常用數(shù)據(jù)庫的前五名,僅次于 MySQL。Bloomberg、Goldman Sachs 和 Nokia 等大公司都在使用 PostgreSQL。
PostgreSQL 可用于各行各業(yè),并不局限于某一領(lǐng)域。以下是目前可以使用 PostgreSQL 的幾個示例。
- 政府 GIS 數(shù)據(jù):PostgreSQL 包含一個強大的名為“PostGIS”的擴展。此擴展提供了許多有助于處理不同幾何形式(如點、線)的功能,并經(jīng)過優(yōu)化以減少磁盤和內(nèi)存占用,從而提高查詢性能。電力、應急服務和水利基礎設施服務主要依靠 GIS 來定位,因此對政府來說非常有用。
- 制造業(yè):許多制造業(yè)需要大量高效的數(shù)據(jù)存儲設施。PostgreSQL 是優(yōu)化供應鏈性能和存儲的合適選擇。它是首選,因為它符合 ACID 標準,并且可以配置為自動故障轉(zhuǎn)移、完全冗余和幾乎零停機升級。由于 Oracle 的新許可政策使較小的企業(yè)難以維持使用 Oracle 的成本,因此首選 PostgreSQL。
- Web 技術(shù):PostgreSQL 不僅僅是一個關(guān)系數(shù)據(jù)庫;它還可以用作 NoSQL 風格的數(shù)據(jù)存儲。你可以在一個產(chǎn)品中同時支持關(guān)系和文檔。它可以在許多現(xiàn)代框架中運行,如 Django (Python)、Hibernate (Java)、Ruby on Rails、PHP 等。由于它的復制能力,網(wǎng)站可以很容易地擴展數(shù)據(jù)庫服務器。
- 科學數(shù)據(jù):研究和科學項目可以生成數(shù) TB 的數(shù)據(jù),必須盡可能以最實用的方式處理這些數(shù)據(jù)。PostgreSQL 具有出色的分析能力并提供強大的 SQL 引擎,因此處理大量數(shù)據(jù)不會出現(xiàn)問題。PostgreSQL 也可以輕松擴展。可以集成 Matlab 和 R 來執(zhí)行多個數(shù)學和聚合函數(shù)。
什么是 MySQL?
MySQL 是一個簡單的關(guān)系數(shù)據(jù)庫系統(tǒng)。它非常高效,并且用戶友好,這是它成為最知名的技術(shù)之一的原因。使用 SQL,你可以快速掌握幾個結(jié)構(gòu)化查詢語言概念 (SQL) 來構(gòu)建強大的數(shù)據(jù)存儲系統(tǒng)。它的社區(qū)版是免費的。
以下討論下它的歷史、主要特性和用例。
歷史
MySQL 由瑞典公司 MySQLAB 于 1995 年由 Michael “Monty” Widenius、瑞典人 David Axmark 和 Allan Larsson 創(chuàng)建。Sun Microsystems 隨后收購了 MySQLAB。
MySQL 的目的是為企業(yè)和家庭用戶等提供高效可靠的數(shù)據(jù)管理選項。該平臺的 Alpha 和 Beta 版本于 2000 年發(fā)布,其中大部分與主流平臺兼容。
大約在同一時間,它開源了,允許第三方開發(fā)人員對系統(tǒng)進行重大更改。然而,開源意味著收入損失,但隨著 MySQL 開始流行,收入最終得以恢復。
到 2001 年底,活躍安裝量達到了驚人的 200 萬。2002年初,公司擴大業(yè)務,在美國設立總部。這時,該平臺已經(jīng)擁有 300 萬用戶,收入達到 650 萬美元,并且從那時起它的受歡迎程度不斷提高。
主要特點
MySQL 服務器是多線程、多任務的,被設計用于重負載生產(chǎn)系統(tǒng)。它具有事務和非事務引擎,是最容易安裝的數(shù)據(jù)庫系統(tǒng)之一。MySQL 因其易于使用、可靠和快速而深受用戶歡迎。
現(xiàn)在你已經(jīng)了解了 MySQL 的起源,接下來討論一下它的一些關(guān)鍵特性。
使用方便
MySQL 因其易用性而流行起來。它保證了一些特性,如觸發(fā)器、存儲過程等。還包括各種實用程序,如崩潰時的備份程序、mysqladmin、管理客戶端和用于管理的 GUI(MySQL 工作臺)。對于初學者,它通過全面的 GUI 提供了廣泛的選項,使其成為當今使用最多的五個數(shù)據(jù)庫之一。
高靈活性
MySQL 為大容量項目提供有效和安全的交易。它足夠靈活,可以在動態(tài)環(huán)境中工作。由于它是開源的,因此代碼是免費提供的,并且可以根據(jù)你的自身需求進行修改。
可靠性和安全性
就像 PostgreSQL 一樣,MySQL 也遵循 ACID 模型。因此,在進行交易時無需擔心。
如果系統(tǒng)崩潰,它將恢復到最后一個檢查點,從而確保沒有數(shù)據(jù)丟失。此外,由于它是開源的,因此有一個龐大的開發(fā)人員社區(qū)可以確保系統(tǒng)正常運行,在論壇中擴展他們的支持,并修復各種錯誤。
此外,它通過支持外鍵約束來提供數(shù)據(jù)完整性,從而避免表之間的數(shù)據(jù)不一致。它有一個密碼系統(tǒng),提供了一個安全的接口,可以保證在訪問數(shù)據(jù)庫之前根據(jù)主機驗證密碼。密碼在連接到服務器時會被加密。
高性能
由于 MySQL 的存儲引擎架構(gòu)非常卓越,因此它的性能非常快速、可靠。這意味著它可以在不丟失軟件重要功能的情況下提供高性能。
隨著時間的推移,MySQL 通過具有索引壓縮的 B 樹磁盤表、優(yōu)化的嵌套循環(huán)連接和基于線程的內(nèi)存分配等功能來提高其性能。存儲引擎中的行級鎖定和常量讀取為多用戶并發(fā)提供了額外的性能優(yōu)勢。
可擴展
除了免費和開源之外,MySQL 程序還可以用多種語言編寫。MySQL 連接器/NET 允許開發(fā)人員將他們的數(shù)據(jù)鏈接到數(shù)據(jù)庫。Connector/J 接口為使用 JDBC 關(guān)聯(lián)的 Java 客戶端程序提供 MySQL 支持。用 C 編寫的客戶端庫適用于用 C 或 C++ 或任何提供 C 綁定的語言編寫的客戶端。
還可以訪問用于 C、C++、Eiffel、Java、Perl、PHP、Python、Ruby 和 Tcl 的 API。它也是最受歡迎的跨平臺數(shù)據(jù)庫系統(tǒng)之一,可以在Linux、Windows、Solarix等平臺上使用。這一切都表明它幾乎適用于任何軟件和操作系統(tǒng),這使得它具有很強的可擴展性。
開源許可證
MySQL 在開源許可證下可供用戶使用。
由于它是開源的,它得到了開發(fā)人員的大量支持,確保錯誤和安全問題得到快速修復。MySQL 擁有用戶群體、論壇和支持。
用例
MySQL 被證明對 Web 應用程序很有用,因為大多數(shù)服務器都依賴 MySQL。除了用作 WordPress 數(shù)據(jù)庫外,許多非 WordPress 企業(yè)(如 Joomla、TYPO3 和 Drupal)也使用 MySQL 作為其主要數(shù)據(jù)庫。
以下是 MySQL 的一些用例,證明它是一個可靠且高效的數(shù)據(jù)庫系統(tǒng):
- OLTP 事務:事務需要速度和準確性。MYSQL 可以高效、輕松地擴展到每秒 1000 次查詢。事務需要保證原子性、一致性、隔離性和持久性(ACID)。MySQL 還遵守 ACID 原則,確保關(guān)鍵事務的安全。如果系統(tǒng)在事務期間出現(xiàn)故障,它會回滾到檢查點。
- LAMP 開源技術(shù)棧:MySQL 對于在 LAMP 開源軟件技術(shù)棧上運行的眾多應用程序至關(guān)重要(LAMP 代表 Linux、Apache、MySQL 和 PHP/Python/Perl)。LAMP 是 Web 服務的通用解決方案,被廣泛認為是動態(tài)網(wǎng)站和高性能 Web 應用程序的首選。
- 電子商務應用程序:MySQL 是電子商務平臺最流行的交易數(shù)據(jù)庫之一。它有利于管理客戶數(shù)據(jù)、交易和產(chǎn)品目錄。在電子商務解決方案中,MySQL 通常與其他非關(guān)系數(shù)據(jù)庫同時使用,包括用于同步訂單數(shù)據(jù)和存儲非產(chǎn)品數(shù)據(jù)的文檔和鍵值存儲。
PostgreSQL 與 MySQL:正面比較
如果你不知道該怎么選擇數(shù)據(jù)庫,本節(jié)將會闡述。
語法
說到語法,Postgresql 和 MySQL 都很相似。這是兩者的選擇查詢的樣子:
SELECT * FROM STUDENTS;
但是,MySQL 不支持多個子查詢,例如“LIMIT”或“ALL”。它還不支持標準 SQL 子句,如“INTERSECT”或“OUTER JOIN”。
MySQL 不像 PostgreSQL 那樣完全符合 SQL,PostgreSQL支持上面提到的所有子查詢。如果你的業(yè)務需要經(jīng)常使用這些子查詢,那么 PostgreSQL 將是一個更合適的選擇。
支持的語言
PostgreSQL 和 MySQL 支持許多相同的語言,但存在一些差異。
另一方面,PostgreSQL 支持更廣泛的編程語言:
- C/ C++
- Delphi
- Erlang
- Go
- Java
- Javascript
- JSON (native since version 9.2)
- Lisp
- .NET
- Python
- R
- Tcl
- 其他編程語言
以下是 MySQL 支持的語言列表:
- C/C++
- Delphi
- Erlang
- Go
- Java
- Lisp
- Node.js
- Perl
- PHP
- R
速度
速度是一個不可或缺的因素,一個快速的數(shù)據(jù)庫不僅可以確保網(wǎng)站運行得更快,而且還可以通過刪除未使用數(shù)據(jù)來減輕服務器的壓力。
PostgreSQL 和 MySQL 都以市場上最快的 DBMS 解決方案而聞名。然而,這一類別中沒有明顯的贏家。你可以很容易地找到基于配置、測試和硬件推薦一種數(shù)據(jù)庫的基準測試。一個可能在并發(fā)性方面占上風(PostgreSQL),而另一個可能在內(nèi)存很少的單核機器上表現(xiàn)更好(MySQL)。
最終,這取決于你如何使用。眾所周知,MySQL 在處理只讀命令時速度更快,但會犧牲并發(fā)性,而 PostgreSQL 在處理讀寫操作、海量數(shù)據(jù)集和復雜查詢時效果更好。
架構(gòu)
MySQL 是純關(guān)系數(shù)據(jù)庫,而 PostgreSQL 是對象關(guān)系數(shù)據(jù)庫。PostgreSQL 提供更復雜的數(shù)據(jù)類型,并允許對象繼承屬性。另一方面,這也使得使用 PostgreSQL 變得更加復雜。PostgreSQL 擁有一個單一的、符合 ACID 標準的存儲引擎。而 MySQL 除了默認的存儲引擎 InnoDB 之外, 還支持 15 種不同的存儲引擎。
PostgreSQL 通過為每個建立的客戶端連接分配內(nèi)存來生成一個新的系統(tǒng)進程。在具有許多客戶端連接的系統(tǒng)上,這需要大量內(nèi)存。另一方面,MySQL 使用單個進程并為每個連接維護一個線程,因此小的企業(yè)應用程序的更合適。
性能
PostgreSQL 是一個符合標準、功能豐富且可擴展的數(shù)據(jù)庫。以前,PostgreSQL 性能平穩(wěn)——讀取通常比 MySQL 慢,但它可以更有效地寫入大量數(shù)據(jù)。除此之外,PostgreSQL 比 MySQL 更好地處理并發(fā)性。
在過去幾年中,它們之間的能力差距已大大縮小。如果你使用舊的 MyISAM 引擎,MySQL 在讀取數(shù)據(jù)方面仍然非常快。它還經(jīng)過優(yōu)化,可以在大量數(shù)據(jù)寫入方面趕上 PostgreSQL。
在選擇合適的工具時,性能不應成為大多數(shù)普通應用程序的約束因素。PostgreSQL 和 MySQL 在大多數(shù)情況下都具有相同的性能。
復制與集群
數(shù)據(jù)復制是將數(shù)據(jù)從數(shù)據(jù)庫復制到其副本數(shù)據(jù)庫的過程,以確保每個實例都擁有相同級別的信息。復制還帶來了各種好處,例如容錯、可伸縮性、自動備份以及在不影響主集群的情況下執(zhí)行長查詢的能力。
MySQL 和 PostgreSQL 都支持復制。PostgreSQL 提供同步復制,這意味著它有兩個數(shù)據(jù)庫同時運行,主數(shù)據(jù)庫與副本數(shù)據(jù)庫同步。你甚至可以使用 PostgreSQL 執(zhí)行同步和級聯(lián)復制。然而,在 MySQL 中,復制是單向異步的。這意味著一臺數(shù)據(jù)庫服務器充當主服務器,其他服務器是副本。
MySQL 和 PostgreSQL 也都支持集群。集群利用共享存儲將一組相等的數(shù)據(jù)復制到環(huán)境中的每個節(jié)點。這讓數(shù)據(jù)庫能夠容忍故障,因為在環(huán)境中的各個節(jié)點之間復制數(shù)據(jù)會產(chǎn)生冗余。
數(shù)據(jù)和表結(jié)構(gòu)
JSON 支持仍然是 MySQL 主要 NoSQL 特性之一。相比之下,PostgreSQL 支持用戶定義的類型、數(shù)組、hstore 和 XML,能夠處理更多數(shù)據(jù)類型。例如,通過接受數(shù)組作為數(shù)據(jù)類型,PostgreSQL 還可以提供與這些數(shù)組兼容的宿主函數(shù)。
盡管使用替代格式存儲數(shù)據(jù)具有優(yōu)勢,但執(zhí)行此類數(shù)據(jù)格式可能會更加復雜,因為它們不遵循長期基準。因此,與數(shù)據(jù)庫一起使用的組件可能并不總是遵循 PostgreSQL 格式。
就 SQL 合規(guī)性而言,MySQL 僅部分符合 SQL,因為它不支持所有功能,如無檢查約束。
相比之下,PostgreSQL 比 MySQL 更符合 SQL,支持大多數(shù)主要的 SQL 特性——準確地說,支持179 個強制特性中的 160 個。
可擴展性
PostgreSQL 被認為是一種高度可擴展的工具,因為它支持 MySQL 中找不到的各種高級數(shù)據(jù)類型。包括網(wǎng)絡地址類型、本機 UUID、幾何/GIS、可以索引的 JSON 和時區(qū)感知時間戳。
因此,如果你的應用程序正在處理非結(jié)構(gòu)化數(shù)據(jù)或獨特數(shù)據(jù)類型,PostgreSQL 將會是更好的選擇。但是,如果只處理基本的數(shù)字和字符數(shù)據(jù)類型,那么這兩個數(shù)據(jù)庫都可以選擇。
索引
為了提高數(shù)據(jù)庫性能,可以創(chuàng)建索引。如果沒有索引,查詢會很慢并且會成為 DBMS 的主要負擔。
PostgreSQL 和 MySQL 都提供了不同的索引選項。PostgreSQL 索引類型包括以下:
- 僅排列表的一部分信息的部分索引
- B樹索引和散列索引
- 表達式索引,生成由表達式函數(shù)生成的索引
MySQL 提供以下索引選項:
- 存儲在 R 樹上的索引,例如在空間數(shù)據(jù)類型上找到的索引
- 存儲在 B 樹上的索引,例如 PRIMARY KEY、INDEX、FULLTEXT 和 UNIQUE
- 使用 FULLTEXT 索引時的倒排列表和哈希索引
安全
PostgreSQL 和 MySQL 都支持組和用戶管理,并為各種角色授予 SQL 權(quán)限。MySQL 支持用于用戶身份驗證的本機窗口服務、PAM 和 LDAP,而 PostgreSQL 支持使用 Kerberos 和 PAM 的基于 IP 的客戶端身份驗證和過濾。因此,這兩個數(shù)據(jù)庫在安全性方面并駕齊驅(qū)。
支持與社區(qū)
PostgreSQL 和 MySQL 都有有用的社區(qū)來為用戶提供支持。
PostgreSQL 擁有龐大的志愿者社區(qū),他們通過郵件列表和 IRC 為用戶提供免費建議。除此之外,你可以通過第三方提供商購買付費支持。甚至可以通過閱讀市場上各種有用的 PostgreSQL 書籍和手冊來解決問題。
MySQL 也有一個龐大的志愿者社區(qū),他們會花時間提供免費的建議和支持。你可以在 Percona 和 MySQL 網(wǎng)站上利用這種支持。除了免費社區(qū)支持之外,Oracle 還為其所有產(chǎn)品的商業(yè)版本提供 24/7 付費支持。與 PostgreSQL 一樣,你也可以通過深入研究大量免費且有用的 MySQL 指南、書籍和教程來進行故障排除。
總而言之,對 PostgreSQL 的支持可能有點挑戰(zhàn),因為它需要更多的技術(shù)專業(yè)知識才能設置和使用。此外,目前 PostgreSQL 專家的數(shù)量少于 MySQL 專家的數(shù)量。因此,在用戶支持和易管理性方面,MySQL 略勝一籌。
PostgreSQL 與 MySQL:您應該選擇哪個?
總結(jié)一下討論,在兩個數(shù)據(jù)庫之間進行選擇并不那么簡單。
如果你正在尋找一個功能豐富的數(shù)據(jù)庫,可以順利處理龐大的數(shù)據(jù)庫和復雜的查詢,那么你應該選擇 PostgreSQL。
另一方面,如果你是初學者,正在尋找更易于管理和設置的數(shù)據(jù)庫,同時仍然可靠、快速且易于理解,那么可以嘗試 MySQL。