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 Binary JSON, is a binary-encoded serialization of JSON-like documents.
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大小。
而且在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 消息都是由标准消息头部和具体的请求数据组成。
标准消息头部格式如下:
而具体的请求,比如修改集合
具体可以参考http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol。
四、 MongoDB数据文件的内部结构
每个数据库都有一个.ns文件和若干个数据文件组成(.0,.1,.2,.....),其中.ns文件为16M,而.0文件16M,.1文件32M,往后则翻倍,最大值为2G,这样可以让小数据库不浪费太多的空间,大数据库能够使用磁盘上连续的空间。
数据库里面的每个集合和索引都对应着命名空间。
这是local数据库中的命名空间,可以看到集合,固定集合(capped collection),索引都有自己的命名空间。
.ns文件记录着若干个集合命名空间和索引命名空间。
一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间,document之间通过双向链表连接。
索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。MongoDB数据内部结构图如下(图片来自NoSQLFan)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!