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