PostgreSQL vs. MySQL,該怎么選呢?
今天我們就來聊聊PostgreSQL和MySQL,大象和海豚我們到底該選哪個呢?
先放一張對比表格:
PostgreSQL | MySQL | |
許可 | MIT-style license | GNU General Public License |
編程語言 | C | C/C++ |
可視化工具 | PgAdmin | MySQL Workbench |
ACID支持 | 是 | 是 |
存儲引擎 | 單一存儲引擎 | 多種存儲引擎,例如InnoDB和MyISAM |
全文搜索支持 | 是 | 是(有限) |
刪除臨時表 | 在DROP TABLE語法中沒有TEMP或者TEMPORARY關(guān)鍵字 | 在DROP TABLE語法語句中支持TEMP或者TEMPORARY關(guān)鍵字,只允許刪除臨時表。 |
刪除表(DROP TABLE) | 支持CASCADE刪除表的依賴對象的選項,例如表和視圖。 | 不支持CASCADE選項。 |
刪除表(TRUNCATE TABLE) | PostgreSQL TRUNCATE TABLE支持更多功能,如CASCADE、RESTART IDENTITY、CONTINUE IDENTITY、 事務(wù)安全等。 | MySQL TRUNCATE TABLE 不支持CASCADE和事務(wù)安全。數(shù)據(jù)一旦刪除,就無法回滾。 |
自動遞增列 | SERIAL | AUTO_INCREMENT |
身份列 | 有 | 無 |
解析函數(shù) | 有 | 無 |
數(shù)據(jù)類型 | 支持許多高級類型,例如array、hstore和用戶定義的 type。 | SQL標(biāo)準(zhǔn)類型 |
無符號整數(shù) | 無 | 有 |
布爾類型 | 有 | 使用TINYINT(1)來表示布爾類型 |
IP地址數(shù)據(jù)類型 | 有 | 無 |
設(shè)置列的默認(rèn)值 | 同時支持常量和函數(shù)調(diào)用 | 必須是常量或者TIMESTAMP或者DATETIME 列設(shè)置CURRENT_TIMESTAMP為默認(rèn)值 |
CTE(通用表表達(dá)式) | 有 | 有(MySQL 8.0支持) |
EXPLAIN輸出 | 更多詳情信息 | 較少的信息 |
物化視圖 | 有 | 無 |
檢查約束 | 有 | 有(MySQL 8.0.16以后支持, 之前MySQL只是忽略檢查) |
表繼承 | 有 | 無 |
存儲過程編程語言 | Ruby, Perl, Python, TCL, PL/pgSQL, SQL, JavaScript, etc. | SQL:2003存儲過程語法 |
FULL OUTER JOIN | 有 | 無 |
INTERSECT | 有 | 無 |
EXCEPT | 有 | 無 |
部分索引 | 有 | 無 |
位圖索引 | 有 | 無 |
表達(dá)式索引 | 有 | 無 |
覆蓋索引 | 有(9.2版本之后) | 有. MySQL支持覆蓋索引,允許僅通過掃描索引來檢索數(shù)據(jù),而無需接觸表數(shù)據(jù)。這對于具有數(shù)百萬行的大型表來說是有利的。 |
觸發(fā)器 | 支持可以在大多數(shù)類型的命令上觸發(fā)的觸發(fā)器,但影響全局?jǐn)?shù)據(jù)庫的觸發(fā)器除外,例如角色和表空間。 | 僅限于某些命令 |
分區(qū) | RANGE, LIST | RANGE、LIST、HASH、KEY 以及使用 RANGE 或 LIST 與 HASH 或 KEY 子分區(qū)組合的復(fù)合分區(qū) |
任務(wù)調(diào)度 | pgAgent | Scheduled event |
連接可擴(kuò)展性 | 每個新連接都是一個操作系統(tǒng)進(jìn)程 | 每個新連接都是一個操作系統(tǒng)線程 |
看完上面的表格,我們基本上對PostgreSQL和MySQL之間的差異有了大概的了解,下面我們詳細(xì)的說明一下:
語法
就語法而言,Postgresql 和 MySQL 都很相似。以下是兩者的選擇查詢:
SELECT * FROM STUDENTS;
但是,MySQL 不支持多個子查詢,例如“LIMIT”或“ALL”。它也不支持標(biāo)準(zhǔn) SQL 子句,例如“INTERSECT”或“OUTER JOIN”。
MySQL 不像 PostgreSQL 那樣完全兼容 SQL,后者支持上述所有子查詢。如果您的業(yè)務(wù)需要經(jīng)常使用這些子查詢,那么 PostgreSQL 將是更合適的選擇。
支持的語言
PostgreSQL 和 MySQL 支持許多相同的語言,但存在一些差異。
另一方面,PostgreSQL 提供對更廣泛的編程語言的支持:
- C/ C++
- Delphi
- Erlang
- Go
- Java
- Javascript
- JSON (native since version 9.2)
- Lisp
- .NET
- Python
- R
- Tcl
- Other programming languages
以下是 MySQL 支持的語言列表:
- C/C++
- Delphi
- Erlang
- Go
- Java
- Lisp
- Node.js
- Perl
- PHP
- R
速度
在決定最適合您的業(yè)務(wù)需求的數(shù)據(jù)庫時,速度是一個不可或缺的因素??焖俚臄?shù)據(jù)庫不僅可以確保您的網(wǎng)站運行得更快,而且還可以通過指出可以刪除的未使用數(shù)據(jù)來幫助減輕服務(wù)器的壓力。
PostgreSQL 和 MySQL 都因是市場上最快的 DBMS 解決方案而聞名。然而,這一類別中沒有明顯的贏家。您可以很容易地找到基于配置、測試和硬件推薦一種數(shù)據(jù)庫的基準(zhǔn)測試。一個可能在并發(fā)性方面占據(jù)上風(fēng),而另一個可能在內(nèi)存很少的單核機(jī)器上表現(xiàn)更好。
最終,這取決于您如何使用它們。眾所周知,MySQL 在只讀命令方面速度更快,但代價是并發(fā)性較高,而 PostgreSQL 在讀寫操作、海量數(shù)據(jù)集和復(fù)雜查詢方面表現(xiàn)更好。
體系結(jié)構(gòu)
MySQL 是一個純關(guān)系數(shù)據(jù)庫,而 PostgreSQL 是一個對象關(guān)系數(shù)據(jù)庫。PostgreSQL 提供更復(fù)雜的數(shù)據(jù)類型,并允許對象繼承屬性。另一方面,它也使得使用 PostgreSQL 變得更加復(fù)雜。PostgreSQL 擁有一個單一的、符合 ACID 的存儲引擎。除了默認(rèn)存儲引擎 InnoDB 之外,MySQL 還支持 15 種不同的存儲引擎。大量的存儲引擎允許您快速將它們用于其他用例。
PostgreSQL 通過內(nèi)存分配為每個建立的客戶端連接生成一個新的系統(tǒng)進(jìn)程。這需要具有許多客戶端連接的系統(tǒng)上的大量內(nèi)存。另一方面,MySQL 使用單個進(jìn)程并為每個連接維護(hù)一個線程。這使得 MySQL 成為企業(yè)范圍以下應(yīng)用程序的更合適選擇。
表現(xiàn)
PostgreSQL 的構(gòu)建是為了符合標(biāo)準(zhǔn)、功能豐富且可擴(kuò)展。此前,PostgreSQL 的性能表現(xiàn)平穩(wěn)——讀取通常比 MySQL 慢,但它可以更有效地寫入大量數(shù)據(jù)。除此之外,PostgreSQL 比 MySQL 更好地處理并發(fā)性。
在過去幾年中,他們的能力之間的差距已顯著縮小。如果您使用舊的 MyISAM 引擎,MySQL 讀取數(shù)據(jù)的速度仍然相當(dāng)快。它還進(jìn)行了優(yōu)化,以在大量數(shù)據(jù)寫入方面趕上 PostgreSQL。
在為您的目的選擇合適的工具時,性能不應(yīng)成為大多數(shù)普通應(yīng)用程序的約束因素。PostgreSQL 和 MySQL 的性能在很大程度上是相同的。
復(fù)制和集群
復(fù)制是一個允許開發(fā)人員將數(shù)據(jù)從數(shù)據(jù)庫復(fù)制到其副本數(shù)據(jù)庫的過程。這確保了每個用戶都擁有相同級別的信息。復(fù)制還帶來了各種好處,例如容錯、可擴(kuò)展性、自動備份以及在不影響主集群的情況下執(zhí)行長時間查詢的能力。
MySQL 和 PostgreSQL 都支持復(fù)制。PostgreSQL提供同步復(fù)制,這意味著它有兩個數(shù)據(jù)庫同時運行,并且主數(shù)據(jù)庫與副本數(shù)據(jù)庫同步。您甚至可以使用 PostgreSQL 執(zhí)行同步和級聯(lián)復(fù)制。然而,在 MySQL 中,復(fù)制是單向異步的。這意味著一臺數(shù)據(jù)庫服務(wù)器充當(dāng)主數(shù)據(jù)庫服務(wù)器,其他數(shù)據(jù)庫服務(wù)器充當(dāng)副本。
MySQL 和 PostgreSQL 都支持集群。集群利用共享存儲將相同的數(shù)據(jù)集復(fù)制到環(huán)境中的每個節(jié)點。這使得數(shù)據(jù)庫能夠容忍故障,因為在環(huán)境中的各個節(jié)點之間復(fù)制數(shù)據(jù)所產(chǎn)生的冗余。
數(shù)據(jù)和表結(jié)構(gòu)
JSON 支持仍然是 MySQL 納入的領(lǐng)先 NoSQL 功能之一。相比之下,PostgreSQL 支持用戶定義的類型、數(shù)組、hstore 和 XML。能夠處理更多數(shù)據(jù)類型的主要好處是功能的增加。例如,通過接受數(shù)組作為數(shù)據(jù)類型,PostgreSQL 還可以提供與這些數(shù)組兼容的主機(jī)函數(shù)。
然而,盡管使用替代格式存儲數(shù)據(jù)具有優(yōu)勢,但執(zhí)行此類數(shù)據(jù)格式可能會更加復(fù)雜,因為它們不遵循長期的基準(zhǔn)。因此,與數(shù)據(jù)庫一起使用的組件可能并不總是遵循 PostgreSQL 格式。
MySQL在SQL合規(guī)性方面僅部分兼容SQL,因為它不支持像無檢查約束這樣的所有功能。也就是說,它確實提供了很多擴(kuò)展。
相比之下,PostgreSQL 比 MySQL 更符合 SQL 規(guī)范,支持大多數(shù)主要 SQL 功能 —準(zhǔn)確地說,支持 179 個強(qiáng)制功能中的 160 個。
可擴(kuò)展性
PostgreSQL 被認(rèn)為是一種高度可擴(kuò)展的工具,因為它支持 MySQL 中找不到的各種高級數(shù)據(jù)類型。這將包括網(wǎng)絡(luò)地址類型、本機(jī) UUID、幾何/GIS、可索引的 JSON 以及時區(qū)感知時間戳。如果這沒有使 PostgreSQL 在這一輪中成為明顯的贏家,您可以添加運算符、數(shù)據(jù)類型和索引類型。
因此,如果您的應(yīng)用程序正在處理非結(jié)構(gòu)化數(shù)據(jù)或任何可用的獨特數(shù)據(jù)類型,PostgreSQL 可能是更好的選擇。但是,如果您只處理基本的數(shù)字和字符數(shù)據(jù)類型,那么這兩個數(shù)據(jù)庫都應(yīng)該可以正常工作。
索引
為了提高數(shù)據(jù)庫性能,您可以在處理大型數(shù)據(jù)表時使用索引來加速 SQL 查詢。如果沒有索引,查詢將會很慢,并且會成為 DBMS 的主要負(fù)擔(dān)。
PostgreSQL 和 MySQL 都提供不同的索引選項。PostgreSQL 索引類型包括以下幾種:
- 部分索引僅排列表的一部分信息。
- B樹索引和哈希索引。
- 表達(dá)式索引,生成由表達(dá)函數(shù)而不是列值生成的索引。
另一方面,MySQL 提供以下索引選項:
- 存儲在 R 樹上的索引,例如在空間數(shù)據(jù)類型上找到的索引。
- 存儲在 B 樹上的索引,例如 PRIMARY KEY、INDEX、FULLTEXT 和 UNIQUE。
- 使用 FULLTEXT 索引時的倒排列表和哈希索引。
安全
PostgreSQL和MySQL都支持組和用戶管理,并為各種角色授予SQL權(quán)限。MySQL 支持本機(jī)窗口服務(wù)、PAM 和 LDAP 進(jìn)行用戶身份驗證,而 PostgreSQL 支持使用 Kerberos 和 PAM 的基于 IP 的客戶端身份驗證和過濾。因此,這兩個數(shù)據(jù)庫在安全性方面不相上下。
支持與社區(qū)
PostgreSQL 和 MySQL 都有有用的社區(qū)來為用戶提供支持。
PostgreSQL 擁有龐大的志愿者社區(qū),他們通過郵件列表和 IRC 向用戶提供免費建議。除此之外,您甚至可以通過第三方提供商購買付費支持。您甚至可以通過瀏覽市場上各種有用的 PostgreSQL 書籍和手冊來排除故障。
MySQL 也有一個龐大的志愿者社區(qū),他們會花時間為您提供免費建議和支持。您可以在 Percona 和 MySQL 網(wǎng)站上利用此類支持。除了免費社區(qū)支持之外,Oracle 還為其所有產(chǎn)品的商業(yè)版本提供 24/7 付費支持。與 PostgreSQL 一樣,您也可以通過深入研究大量免費且有用的 MySQL 指南、書籍和教程來進(jìn)行故障排除。
總而言之,對 PostgreSQL 的支持可能有點具有挑戰(zhàn)性,因為它需要更多的技術(shù)專業(yè)知識來設(shè)置和使用。此外,目前可供您使用的 PostgreSQL 專家數(shù)量少于 MySQL 專家數(shù)量。所以,在用戶支持和管理方便性方面,MySQL略勝一籌。
總結(jié)
總的來說,Postgres 有更多功能、更繁榮的社區(qū)和生態(tài);而 MySQL 則更易學(xué)習(xí)并且擁有龐大的用戶群體。
我們觀察到了與 Stack Overflow 結(jié)果相同的行業(yè)趨勢,即 Postgres 在開發(fā)者中變得越來越受歡迎。但根據(jù)我們的實際體驗,精密的 Postgres 犧牲了一些便利性。如果你想使用Postgres最好多看看文檔,并運行幾個查詢來上手,有一些學(xué)習(xí)成本,MySQL 會更容易一些。有時候,功能多并不意味著好,擇適合自己的才是最好的 。