mongodb系列之存储结构篇

前面已经说过mongodb是文档型存储的,bson方式存储的,下面主要通过逻辑和物理两方面分别描述下mongodb的存储方式。

1、逻辑存储结构

先看一条数据:

save语句太长了,截图不好截,摘出来了:

db.user.save({name:"test_a",age:30,sex:"male",addr:{zcode:100000,waddr:"北京市海淀区中关村",haddr:"北京市海淀区中关村",mobile:"13488888888", telep:"010-88888888"},job:"高级工程师",hobby:["游泳","上网","爬山","骑行"]})

从图片可以看出,info是数据库名,user是传统表名(mongodb中叫collection)。再看这条信息,_id是自动生成的(我没有主动插入),addr是一个子文档,hobby是一个数组。由此可知mongodb的逻辑存储结构是:


2、物理存储结构

以前面举的集群为例,由于配置文件开启了directoryperdb=true,可以看到在定义的数据文件目录 /opt/mongodb/data/s1下面已经有一个info的文件夹,拿就是我在上面插入数据时创建的数据库(mongodb的数据库不需要额外的创建语句)。

然后进入info目录,

可以看到里面有2种文件,一种是info.n(n表示数字,从0开始,由于我用的是64位机器,所以文件从64M开始,每次翻倍,直到2G后每次都生成2G),这是数据文件,数据文件在内部分为很多块,每一块保存一个名字空间的数据,块与块之间用链表连接,每块中的每条数据间也用链表连接。还有一个是16m的文件info.ns,info.ns是一个命名空间文件,用来保存名字空间对应的元数据,info.ns是一个hashtable,保存了每个名字空间中的储存信息,包括大小,块数,第一块位置,最后一块位置,索引信息等,而块的位置又通过文件序号(后面跟的数字)与文件中的偏移量来确定。

需要注意的是,我现在数据库里面只有一条不到2k的数据,为什么会有2个数据文件,一个64m,一个128m呢?

这正是由mongodb的存储空间预先分配决定的,当你开始往64m的文件中存储数据时,同时mongodb会预先分配一个128m的文件空间,并且用0来填充,这样每次都有一个文件的空间是完全没有存放数据的,虽然浪费了一定大小的空间,但是也免去了每次写入时分配空间消耗的时间,加快了存储速度。

看一下我在网上找的一张图片,mongodb的文件内部存储结构:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值