MongoDB存儲結構


http://www.cnblogs.com/zabery/archive/2012/07/09/mongodb-nei-bu-jie-gou.html

MongoDB內部結構

 

一、前言

本文主要講述MongoDB使用的數據類型BSON,使用的傳輸協議Mongo Wire Protocol,MongoDB數據文件的內部結構。

二、BSON

BSON [bee · sahn], short for Bin­ary JSON, is a bin­ary-en­coded seri­al­iz­a­tion of JSON-like doc­u­ments.

JSON相信大家都很熟悉,官網上用一個頁面,幾百字就把JSON的規則講清楚了,JSON只包括六種數據類型:null,對象,布爾,數字,字符串以及數組。而BSON支持更多的數據類型,比如日期類型等。

       BSON官網的一個例子{"hello": "world"},分析BSON的存儲結構如下:

TotalSize(4)| { BSONType(1)| FieldName | Data } * EOO(1)

TotalSize:Document轉換為BSON后的總長度,4個字節表示

BSONType:Data的數據類型,占一個字節

FieldName:字段名,例子中的hello,key/value的"key",UTF-8字符串,字符串都有一個結束符'\0'

Data:key/value的value,例子中的"world",如果是字符串則在Data前需要另加四個字節存儲Data的長度,如果是其他格式可以參考官網規范

*:key/value的對數,比如{"hello":"world", "hello1":"world1"},有兩對

EOO:結束符,\x00

分析例子{"hello":"world"}的長度:

TotalSize(4) + BSONType(1) + FieldName(5+1) + Data(4 + 5 + 1) + EOO(1) = 22 字節

進入Mongo Shell可以通過Object.bsonsize 查看bson大小。

QQ截圖20120708174805

而且在http://bsonspec.org/#/specification的example中也可以看到BSON的前四個字節為\x16\x00\x00\x00,十進制正好是22。

     BSON犧牲一些空間來換取更容易遍歷的格式,不用每次都檢查是否等於'\0',可遍歷性是BSON非常重要的性質。

三、 Mongo Wire Protocol

Mongo Wire Protocol 與 http, ftp都屬於應用層協議,只不過該協議目前只是應用於MongoDB 的相關應用中。每個Mongo Wire Protocol 消息都是由標准消息頭部和具體的請求數據組成。

標准消息頭部格式如下:

QQ截圖20120708204706

而具體的請求,比如修改集合

QQ截圖20120708204750

具體可以參考http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol

四、 MongoDB數據文件的內部結構

QQ截圖20120709095852

每個數據庫都有一個.ns文件和若干個數據文件組成(.0,.1,.2,.....),其中.ns文件為16M,而.0文件16M,.1文件32M,往后則翻倍,最大值為2G,這樣可以讓小數據庫不浪費太多的空間,大數據庫能夠使用磁盤上連續的空間。

數據庫里面的每個集合和索引都對應着命名空間。

QQ截圖20120709100645

這是local數據庫中的命名空間,可以看到集合,固定集合(capped collection),索引都有自己的命名空間。

.ns文件記錄着若干個集合命名空間和索引命名空間。

一個集合命名空間又有多個數據域(extent),集合命名空間里存儲着集合的元數據,比如集合名稱,集合的第一個數據域和最后一個數據域的位置等等。而一個數據域由若干條文檔(document)組成,每個數據域都有一個頭部,記錄着第一條文檔和最后一條文檔的為知,以及該數據域的一些元數據。extent之間,document之間通過雙向鏈表連接。

索引的存儲數據結構是B樹,索引命名空間存儲着對B樹的根節點的指針。MongoDB數據內部結構圖如下(圖片來自NoSQLFan)

O6EzR

 
分類:  MongoDB


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM