MongoDB一些知识

内存映射存储引擎:
MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟内存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。
MongoDB默认的存储引擎是内存映射引擎. 当服务器启动后,将所有数据映射到内存. 然后由操作系统来负责将缓冲数据写入磁盘并将数据调入调出内存页面.
1.MongoDB管理内存的代码非常精炼,原因就是将大部分工作推给了操作系统.
2.MongoDB管理进程的虚拟大小通常会非常大,超过整个数据集的大小. 这没关系,因为操作系统会处理让哪些数据常驻内存.
3.MongoDB不能控制数据写入到磁盘的顺序,也就不能预写日志提供单机的持久性. 
4.32位的MongoDB服务器有个限制,每个MongoDB最多只能处理2GB数据. 这是因为所有数据必须能用32位地址访问到.

BSON:
MongoDB的文档是一个抽象概念. 其具体的呈现形式取决于使用的驱动和编程语言. 因为MongoDB中的通信大量依赖于文档,所以需要一种所有驱动,工具和进程都能共享的文档表达放手. 这种表达叫做Binary JSON(BSON).
BSON是轻量的二进制格式,能将MongoDB的所有文档表示为字节字符串. 数据库能理解BSON,存在磁盘上的文档也是这种格式.
当驱动要插入文档,或者将文档作为查询条件,驱动会将文档转换成BSON,然后再发往服务器. 同样,返回客户端的文档也是BSON格式的字符串. 驱动需要将这些数据解码.变化本机的文档表示,最后返回给客户端.
用BSON格式的3个主要目标:
1.效率: BSON设计用来更有效地表示数据,占用更少的空间. 最差的情况下,BSON比JSON效率略低;最好的情况下(比如存放二进制数据或者大数),BSON要高效得多.
2.可遍历性: 有些时候BSON牺牲了空间效率,换取更容易遍历的格式. 例如,在字符串前面加入其长度,而不是在结尾处使用一个终结符. 这对MongoDB内省文档很有用.
3.性能: 最后BSON的编码和解码速度都很快. 它用C风格的表现形式来表示类型,在大多数编程语言中都非常快.

Mongo传输协议:
驱动在TCP/IP协议的基础上简单封装了MongoDB传输协议,用来与MongoDB交互. 基本上就是一个简单封装的BSON数据. 例如,插入消息会有20字节的头部数据(包括告知服务器执行插入操作的代码,以及消息长度).要插入的集合名,要插入的BSON文档列表.

数据文件:
MongoDB的数据目录(默认是/data/db)中,每个数据库都有几个独立的文件. 每个数据库有一个.ns文件和若干数据文件,数据文件以递增的数字结尾. 所有数据库foo会被存放在foo.ns,foo.0,foo.1,foo.2等文件中.
每个新的以数字结尾的数据文件大小会加倍,知道达到最大值2GB. 这是为了让数据库不浪费太多的磁盘空间,同时让大数据使用磁盘上连续的空间.
MongoDB为了保证性能还会预分配数据文件(可以用--noprealloc关闭这一功能).预分配在后台完成,有数据文件被填满时就会自动启动. 这就意味着MongoDB服务器总是试图为每一个数据库保留一个额外的空文件数据,来避免文件分配所产生的阻塞.

命名空间和数据域:
在数据文件内部,每个数据库都是按照命名空间组织的.一种类别的数据与其他类别的分开存放. 每个集合的文档都有自己的命名空间,索引也是. 命名空间的元数据都存放在.ns文件中.
每个命名空间的数据都被分成若干组,放到数据文件的某一区域内,这个区域成为数据域.



在上图(命名空间和数据域)中,可以看到数据foo有3个数据文件,其中第3个是预分配的空文件. 前两个数据文件被分为几个数据域,属于几个不同的命名空间.
上图还展示了一些关于命名空间和数据域有趣的地方.这个命名空间可以由几个不同的数据域,在磁盘上不(必)连续.类似于数据库的数据文件,每个新分配的命名空间的数据域大小也会增加. 这是为了平衡命名空间浪费的空间和尽量让一个命名空间的数据连续做出的折中. 图中还有一个特殊的命名空间$freelist,存放着不再使用的数据域(例如,删除集合或索引产生的数据域).当命名空间分配新的数据域时,系统会先查找空间列表,看看有没有合适大小上的数据域可用.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值