為什麼 MySQL 使用多線程,而 Oracle 和 PostgreSQL 使用多進程?
諸如Oracle這種商業資料庫,基本都支持多種Process Models, Oracle默認是多進程。
根據Understanding MySQL Internals所說, MySQL一開始是Solaris上的 :Thus in May of 1996 MySQL version 1.0 was released to a limited group, followed by a public release in October 1996 of version 3.11.1. The initial public release provided only a binary distribution for Solaris. A month later, the source and the Linux binary were released.
這本書也提及了,為什麼MySQL用多線程:
Just as a good rider becomes one with the horse, Monty(MySQL author) had become one with the computer. It pained him to see system resources wasted. He felt confident enough to be able to write virtually bug-free code, deal with the concurrency issues presented by threads, and even work with s small stack. What an exciting challenge! Needless to say, he chose threads.
Postgres的原因可以在The design of Postgres中找到:
However, this approach requires that a fairly complete special-purpose operating system be built. In contrast, the process-per-user model is simpler to implement but will not perform as well on most conventional operating systems. We decided after much soul searching to implement POSTGRES using a process-per-user model architecture because of our limited programming resources.
總而言之,最根本的原因就如方圓說的,主要是當年操作系統對線程支持不給力,而MySQL是特例,因為開發者喜歡挑戰(不過事實上,那個時候的線程支持已經基本完善了。MySQL後於Oracle和POSTGRES)
至於如果要了解不同model間的優劣,強烈推薦Anatomy of a Database System第二章Process Models.ORACLE在windows上也是多線程。傳統的unix系統,早期沒有提供多線程,只有多進程。linux是最近的版本才加入多線程支持,以前一直都是多進程。windows很早就支持多線程,本地應用大部分也是多線程。因此oracle在windows上一直都是多線程,在unix上才是多進程。多進程的好處是,一個進程崩潰不會影響其他進程,多線程的好處是不需要共享內存這樣的手段來訪問資料庫緩衝區。mysql很可能是從windows發站起來的,pg和oracle都是最早從unix發站起來的,因此前者是多線程,後兩者是多進程。
這裡不從歷史原因說僅僅從技術上講多線程與多進程有什麼什麼好處,因為自己曾經把postgres從多進程改為多線程,中間歷盡苦難。多線程多進程在linux的差別並不是很大,但是在Windows的性能差別就比較大,實際上oralce在Windows的版本也是多線程的。
多進程好處就是相對來講穩定性較好,一個進程掛掉,重新拉起來就好,但是一個線程crash會導致整個進程都crash的.
一般操作系統教科書里的線程和進程的概念只是抽象理論上的,在不同OS里的實現顯然有很大區別。Windows上線程庫很方便很高效,強於posix thread,而process的創建代價就很昂貴;而且這是由MS自己設計實現的,直接以系統API方式提供。Unix上process model更簡單,而multithreading基本就是一個雷區,Unix上幾十年來的主流開發語言C/C++根本就不支持thread(直到C++11),即使後來有了posix thread,在移植性上也是開發人員的噩夢。所以,拋開具體的DB產品不說,multitasking在Windows上一般首選thread,而Unix上肯定是用fork了。這也是為什麼mysql基於solaris卻採用thread會被認為是挑戰。
請看一篇論文,stonebraker的資料庫體系結構~
多進程實現起來方便~多線程資源利用率高~
最好的體系結構是進程池和線程池~
推薦閱讀:
※為何mysql不用raft等協議實現同步複製?
※如何在資料庫中創建一個方法?
※MySQL已經可以干大部分事情了,還有必要使用商業資料庫或者PostgreSQL嗎?
※SQL Server和Oracle,我該選擇哪一個去深入學習?他們各有什麼優勢和劣勢?Ps.我是做.NET開發的。
※什麼操作用協程比較好?
TAG:資料庫 | MySQL | PostgreSQL | Oracle資料庫 |