兩個資料庫的問題(r11筆記第4天)

jeanron100發表於2016-12-06

下午一個偶然的機會聽到了一首歌,讓我一下子想起了在泰國出差的日子。這首歌曲讓我我電腦前工作很長時間,在深夜,因為東南亞時差的原因,我感覺我好像多活了一個小時。有時候醒來是在沙發上,有時候醒來發現燈還沒關,生活就是在這種隨意而又忙碌的感覺下流逝。

歌曲(Long Lost Penpal)推薦給大家,如果你看了歌詞,會發現內容還是蠻傷感的,時光一去不復返。

今天來和大家說兩個話題,是關於多執行緒,多程式的,在資料庫的技術架構中,這兩方面總是核心中的核心。想想現在的開源資料庫,商業資料庫,都大抵如此。

為什麼MySQL是單程式多執行緒,PostgreSQL,Oracle是多程式多執行緒?

我想大家在學習的時候都會有類似的問題,但是這類問題好像書本中是不會得到答案的,因為很多書的目標是告訴你結果而非告訴你更多的原因。

這類問題問起來估計很多人也難以回答,在知乎上我發現了這個問題,而且看到了很多非常讚的回答,所以借花獻佛,拿來主義。

問題的回答來自於連結:

:

諸如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發站起來的,因此前者是多執行緒,後兩者是多程式。


其實這兩個答案看完,可能會有模稜兩可的答案,但是我們可以吸取裡面的精華。

而由第一個問題衍生出第二個問題那就是

為什麼Oracle在Windows上是多執行緒,而在Linux上是多程式的?

估計這個問題丟擲來,會難到一大片資料庫愛好者,這個改怎麼解釋呢,而且感覺也確實是無從說起,同一個資料庫的兩種看似截然不同的實現。

這個答案在知乎上沒有看到滿意的答案,我在asktom上看到了,因為有人在上面問了tom同樣的問題,他的回答有兩個,第一個很委婉,第二個很直接。

委婉的回答:
other then linux is a much cooler OS -- no differnce.
That is the key fundemental thing about Oracle -- we are the same on all platforms. Write to us and you are portable.
Write OS specific code and you are not.
Your client application, whatever it is, will not know if you are on linux or windows or a mainframe.
大體的意思是:兩者沒什麼差別,平臺的差異對應用是透明的,只是技術的實現差異。

當然不久還有網友問了類似的問題,tom就回答的更直白了。我喜歡這種直白。

直接的回答:

windoze is an os that prefers threads.
linux is not.
we do threads on windows.
we do processes on unix
we do whatever the underlying os "likes"

我再丟擲一個問題,MySQL的儲存引擎InnoDB是基於索引組織表(IOT),MyISAM基於heap。為什麼?

而Oracle卻幾乎清一色都是基於heap,也支援IOT

PostgreSQL卻清一色都是heap,卻不不支援IOT.

我們後面找個機會來看看答案,searching...


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2129926/,如需轉載,請註明出處,否則將追究法律責任。

相關文章