整理丨千山
在軟件領(lǐng)域,數(shù)據(jù)庫是毫無疑問的中流砥柱。在這片歷史悠久、玩家眾多的沃土上,流傳著著無數(shù)技術(shù)和商業(yè)交織的故事。如今,老一代商業(yè)數(shù)據(jù)庫日薄西山,開源數(shù)據(jù)庫步步為營,處在浪潮之巔的我們已然可以看見其中的暗流涌動。在這場群雄逐鹿的戲碼里,MySQL與PostgreSQL之爭漸趨白熱化。MySQL的衰落不再是某個聳人聽聞的預(yù)言,而正在成為不可避免的現(xiàn)實。
日前,Stack Overflow面向90000名開發(fā)人員進行的一項調(diào)查顯示,PostgreSQL在數(shù)據(jù)庫引擎的選擇上領(lǐng)先于MySQL,這與往年的調(diào)查相比有了顯著變化。
其中,45.55%的受訪者使用PostgreSQL,而MySQL和SQLite的比例分別為41.09%和30.9%。而就在三年前,同一項調(diào)查顯示,MySQL和PostgreSQL的使用率分別為55.6%和36.1%,由此可見,使用PostgreSQL的用戶群體的增速有多快。
圖源:Stack Overflow
不過,需要指出的是,由于這是一項開發(fā)人員調(diào)查,因此并不反映生產(chǎn)中的使用情況。根據(jù)DB-Engines的數(shù)據(jù)庫流行度排名,其中Oracle排名第一,其次是MySQL、SQL Server和PostgreSQL。還要注意的是,MySQL或其分支MariaDB通常被非常流行的WordPress內(nèi)容管理系統(tǒng)使用,占了大量的生產(chǎn)使用。
盡管如此,不能否認(rèn)的事實是,越來越多的開發(fā)人員傾向于為他們正在開發(fā)的應(yīng)用程序選擇PostgreSQL。而且結(jié)合DB-Engines上總結(jié)的歷年來MySQL和PostgreSQL分?jǐn)?shù)的趨勢變化來看,PostgreSQL從2014年開始進入高速增長狀態(tài),而MySQL自2016年以來開始緩慢下降。
圖源:DB-Engines
相較于MySQL的日漸式微,PostgreSQL為何能取得高速發(fā)展呢?我們可以從其發(fā)展履跡中一窺端倪。
一、脫胎于Ingres的開源數(shù)據(jù)庫
PostgreSQL擁有很長的發(fā)展史。
其前身是美國國防部與加州大學(xué)伯克利分校合作的一個名為Ingres研究項目。1985年Ingres項目終止,隨后開源,Postgre誕生。后來為了強調(diào)對SQL的支持,又更名為PostgreSQL,這一名字延用至今。粗略估算一下,不包括Ingres時期的開發(fā),這一項目的開發(fā)歷史也差不多38年了。
作為開源數(shù)據(jù)庫的PostgreSQL有其鮮明的特點。
其一,跨平臺屬性強,支持幾乎所有的操作系統(tǒng)和CPU硬件平臺,如AIX,HPUX,Linux,BSD,Windows等。
其二,社區(qū)支持強大。項目由全世界超過1000名貢獻者所維護,社區(qū)成員來自于全球的商業(yè)公司、高校、研究機構(gòu)。而且PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復(fù)制、修改和重新分發(fā)代碼,只需要提供一個版權(quán)聲明即可。目前國內(nèi)有很多公司基于PostgreSQL數(shù)據(jù)庫開發(fā)自己的商業(yè)產(chǎn)品。
另外,PostgreSQL提供了單個完整功能的版本,而不像MySQL那樣提供了多個不同的社區(qū)版、商業(yè)版與企業(yè)版。部分粉絲甚至?xí)fPostgreSQL堪與Oracle相媲美,而且沒有那么昂貴的價格和傲慢的客服。
相較于MySQL,PostgreSQL還有一些明顯的特點,比如,支持更廣泛的高級數(shù)據(jù)類型,更精細(xì)的索引系統(tǒng),支持用各種語言編寫的存儲過程,能夠滿足絕大多數(shù)企業(yè)級應(yīng)用的需求。
二、MySQL衰退,并不出奇
PostgreSQL和MySQL同為開源的關(guān)系型數(shù)據(jù)庫,兩者都經(jīng)歷了幾十年的發(fā)展,并且已被證明高可靠、安全和可擴展。但是回顧其發(fā)展歷程,兩者又有著顯著不同。
到2023年,PostgreSQL仍然是完全開源和社區(qū)驅(qū)動的,而MySQL在許可方面有著更復(fù)雜的歷史。MySQL的開發(fā)主體是瑞典MySQLAB公司,最初MySQL是作為公司的商業(yè)產(chǎn)品開發(fā)的,同時提供免費版和付費版。
2008年1月,MySQLAB被Sun公司以10億美元的價格收購。此后不久,Oracle又以74億美元得價格收購了Sun,這一系列收購事件一度讓MySQL數(shù)據(jù)庫前途未卜,也引起了部分開發(fā)人員對其開源未來的擔(dān)憂。后來,包括MariaDB和Percona在內(nèi)的原始MySQL的幾個開源分支幫助緩解了這些問題,但這些動蕩依舊為MySQL的發(fā)展留下了揮之不去的暗影。
多年前,PostgreSQL創(chuàng)始人之一的Bruce Momjian在接受對外采訪時就曾表示:“MySQL衰退,這并不是一件很令人驚奇的事情。”在他看來,MySQL的衰退可以歸因于兩點,其一,MySQL目標(biāo)定位不明晰,其二,MySQL不是一個純粹的開源數(shù)據(jù)庫。
Momjian對此解釋道:“之所以說MySQL目標(biāo)定位不明晰,是因為其目標(biāo)定位是在網(wǎng)絡(luò)應(yīng)用的用戶層面上,而互聯(lián)網(wǎng)企業(yè)要求的是一個快速反應(yīng)時間和較小的用戶量,但相對大用戶來說,MySQL就有點捉襟見肘了,雖然他們非常努力去試圖滿足大客戶的應(yīng)用,想擴展企業(yè)級大客戶的應(yīng)用標(biāo)準(zhǔn),但因為前期開發(fā)的框架不是很明晰,導(dǎo)致不是很成功?!?/p>
在關(guān)于開源的純粹性上,Momjian認(rèn)為:“MySQL數(shù)據(jù)庫是一個公司的一產(chǎn)品,是一個公司做了絕大部分開發(fā)的工作,所以MySQL不是完全意義上的開源數(shù)據(jù)庫,這是個劣勢,不能得到絕大多數(shù)人的支持,或讓社區(qū)更多人參與進來?!?/p>
在他看來,與MySQL不同,PostgreSQL一開始就是定位在Oracle這些大數(shù)據(jù)庫能做的事情。所以MySQL勢力越來越小,而PostgreSQL卻在變大。盡管誰也不知道未來會如何發(fā)展,但PostgreSQL的增長是有目共睹的。
三、在曲折中探索:多進程還是多線程
立足當(dāng)下,回顧過往,PostgreSQL能在開發(fā)者調(diào)查中超越MySQL,并非一朝一夕之功。至于未來如何,及時了解其最新的發(fā)展動向至關(guān)重要。
最近就有一項關(guān)于PostgreSQL的重大提案正在發(fā)生。
眾所周知,和線程架構(gòu)的MySQL不同,PostgreSQL數(shù)據(jù)庫為進程架構(gòu)模型,每一個連接都會啟動一個服務(wù)進程為該連接服務(wù)。
一個PostgreSQL實例作為一大組協(xié)作進程運行,包括一個用于每個連接的客戶端的進程。這些進程使用精心設(shè)計的庫通過多個共享內(nèi)存區(qū)域進行通信,該庫允許在并非所有進程都具有映射到相同地址的相同內(nèi)存的設(shè)置中創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。長期以來,這個模型都在如此為這個項目服務(wù)。
但PostgreSQL開發(fā)團隊覺得到了需要改變的時候,要重新考慮是否延用這種面向進程的模型,還是將其遷移到線程模型。
事實上,多進程的優(yōu)缺點都很分明。
好處在于:可以并行地執(zhí)行多個任務(wù),提高運行效率,數(shù)據(jù)安全,空間獨立,一個進程崩潰也不會影響其他進程;不足在于:進程的創(chuàng)建和銷毀過程需要消耗較多的計算機資源,在需要頻繁創(chuàng)建和刪除較多進程的情況下,資源消耗過多,不適宜使用多進程完成任務(wù)。
6月初,PostgreSQL的核心貢獻者之一Heikki Linnakangas跟進了一些相關(guān)的討論。從討論走向來看,支持和反對的雙方都各有其緣由。
支持方代表Andres Freund提出,開發(fā)團隊已經(jīng)遇到了諸多與進程模型相關(guān)的限制。比如:
1、跨進程上下文切換的開銷本來就比同一進程中線程之間的切換要高,合理懷疑這種開銷會繼續(xù)增加;
2、進程模型增加了開發(fā)成本,迫使項目維護大量重復(fù)代碼,包括在單個地址空間中不需要的幾種內(nèi)存管理機制。
反對方代表則認(rèn)為不應(yīng)該貿(mào)然進行這種根本性變革,“這將是一場災(zāi)難。有太多的代碼會被破壞”。主要理由集中如下:
1、安全性會降低,變革成本過大??赡墚a(chǎn)生“不止一個安全級漏洞”,而且收益無法抵消成本。
2、可能還有其他工作應(yīng)該具有更高的優(yōu)先級。
3、失去由單獨進程提供的隔離,可能會降低系統(tǒng)的整體健壯性。
網(wǎng)友評論
不過,總體而言,仍有許多PostgreSQL開發(fā)人員還是謹(jǐn)慎地贊成至少探索這一變化。Robert Haas表示 ,PostgreSQL在大型系統(tǒng)上的擴展性不佳,這主要是因為所有這些進程都消耗了資源?!安⒎撬袛?shù)據(jù)庫都有這個問題,如果不進行某種重大的架構(gòu)更改,PostgreSQL將無法解決這個問題”。在他看來,僅僅切換到線程可能還不夠,但他認(rèn)為,這種探索性的嘗試將帶來許多其他改進。
如果再進一步思考,我們會注意到,無論是支持基于進程還是基于線程的模式,可能都不會有終極答案。
因為線程可能不會在所有用例中都表現(xiàn)得更好,或者一些重要的擴展可能永遠(yuǎn)不會獲得在線程中運行的支持。移除進程支持是一個只有在線程運行良好時才能真正考慮的問題。雖然討論的結(jié)果表明大多數(shù)PostgreSQL開發(fā)人員認(rèn)為這種探索式的變化在抽象上是好的,但也明顯擔(dān)心它在實踐中如何運作。在不進則退的開源世界,不斷迭代更新才能順應(yīng)時代變化,但變化的方向從來沒有確定的航標(biāo),如何在螺旋中上升是開源開發(fā)者們需要審慎考慮的永恒命題。
參考鏈接:
https://lwn.net/SubscriberLink/934940/3abb2d4086680b78/
http://www.scjtxx.cn/article/167890.html