凡是涉及到內部結構方面的內容,都比較抽象,但是事物的結構往往決定事物的性質,要想更本質的認識mongodb,那就慢慢啃吧!
廢話少說,步入正題:
MongoDB 是一個可移植的資料庫,它在流行的每一個平台上都可以使用,即所謂的跨平台特性。
一個運行著的MongoDB 資料庫就可以看成是一個MongoDB Server,該Server 由執行個體和資料庫組成,在一般的情況下一個MongoDB Server 機器上包含一個執行個體和多個與之對應的資料庫,但是在特殊情況下,如硬體投入成本有限或特殊的應用需求,也允許一個Server 機器上可以有多個執行個體和多個資料庫。
MongoDB 中一系列物理檔案(資料檔案,記錄檔等)的集合或與之對應的邏輯結構(集合,文檔等)被稱為資料庫,簡單的說,就是資料庫是由一系列與磁碟有關係的物理檔案的組成。
體繫結構具體分為:邏輯結構和儲存結構。
邏輯結構不難理解。
MongoDB 的邏輯結構是一種階層。主要由:文檔(document)、集合(collection)、資料庫(database)這三部分組成的。邏輯結構是面向使用者的,使用者使用MongoDB 開發應用程式使用的就是邏輯結構。
MongoDB 的文檔(document),相當於關聯式資料庫中的一行記錄。
多個文檔組成一個集合(collection),相當於關聯式資料庫的表。
多個集合(collection),邏輯上組織在一起,就是資料庫(database)。
一個MongoDB 執行個體支援多個資料庫(database)。
一張非常形象的mongodb與關係型資料庫對比表:
儲存結構,這部分既是重點也是痛點,因為很抽象!
MongoDB 的預設資料目錄是/usr/local/mongodb/data,它負責儲存所有的MongoDB 的資料檔案。在MongoDB內部,每個資料庫都包含一個.ns 檔案和一些資料檔案,而且這些資料檔案會隨著資料量的增加而變得越來越多。所以如果系統中有一個叫做foo 的資料庫,那麼構成foo 這個資料庫的檔案就會由foo.ns,foo.0,foo.1,foo.2。大家可以開啟自己安裝mongodb時的資料庫檔案夾,裡頭就是這些檔案,建立一個資料庫,就會產生相應的一組以資料庫命名的資料檔案,並且本人也動手試過,foo.2大小是foo.1的兩倍,foo.1大小是foo.0的兩倍。
MongoDB 內部有預分配空間的機制,每個預分配的檔案都用0 進行填充,由於有了這個機制, MongoDB 始終保持額外的空間和空餘的資料檔案,從而有效避免了由於資料暴增而帶來的磁碟壓力過大的問題。
由於表中資料量的增加,資料檔案每新分配一次,它的大小都會是上一個資料檔案大小的2倍,每個資料檔案最大2G。這樣的機制有利於防止較小的資料庫浪費過多的磁碟空間,同時又能保證較大的資料庫有相應的預留空間使用。
資料庫的每張表都對應一個命名空間,每個索引也有對應的命名空間。這些命名空間的中繼資料都集中在*.ns 檔案中。
在中,foo 這個資料庫包含3 個檔案用於儲存表和索引資料,foo.2 檔案屬於預分配的空檔案。foo.0 和foo.1 這兩個資料檔案被分為了相應的盤區對應不同的名字空間。
顯示了命名空間和盤區的關係。每個命名空間可以包含多個不同的盤區,這些盤區並不是連續的。與資料檔案的增長相同,每一個命名空間對應的盤區大小的也是隨著分配的次數不斷增長的。這樣做的目的是為了平衡命名空間浪費的空間與保持某一個命名空間中資料的連續性。中還有一個需要注意的命名空間:$freelist,這個命名空間用於記錄不再使用的盤區(被刪除的Collection 或索引)。每當命名空間需要分配新的盤區的時候,都會先查看$freelist 是否有大小合適的盤區可以使用,這樣就回收閒置磁碟空間。
這篇文章當然是自己看資料總結的,自己看得都有點暈乎乎的,不過本人mongodb也用了一段時間了,再來看這些內容,比第一次看更容易理解的多。
所以希望初學者,也能邊學邊使用,邊使用邊領悟。