存储

一、数据模型
MongoDB以BSON文档的形式存储数据,它是Key的富映射,或字段名,值。BSON支持丰富的类型集

合,在BSON文档中的字段能包含数据值或内嵌的文档。在MongoDB中所有文档必须小于16MB,这

是BSON文档的大小。

在MongoDB中的每个文件存储在一个记录中它包括文档自身和额外的空间,或者说是填充,填充

因为结果更新文件增长。所有的记录位于连接的磁盘上,当一个文档变得比分配的记录大时,

MongoDB必须分配一个新的记录。新的分配要求MongoDB移动一个文件,并更新引用文档的所有索

引,这比就地更新需要更多的时间,并导致存储碎片。

所有的记录都是一个集合的一部分,这是文献中MongoDB数据库的逻辑分组。在一个集合中的文

档共享一组索引,而且通常这些文档共享公共字段和结构。


在MongoDB中的数据库结构是一组相关的集合。每个数据库都有一个唯一的数据文件集,并且可

能包含大量的集合。此外,每个数据库都有一个唯一的写入锁,在写操作期间锁定写操作到数据

库,一个单独的MongoDB部署可能有很多的数据库。

二、日志

为了确保所有MongoDB修改的数据集被永久地写入到磁盘,MongoDB中记录所有修改到日志,写入磁盘比写入数据更频繁。该日志让MongoDB在mongod实例退出后成功恢复的数据文件中的数据,而不清除所有更改。

请参阅日记记录机制的有关MongoDB日志的详细信息。

三、记录分配策略

MongoDB支持多种记录分配策略,创建记录时确定如何mongod添加填充到一个文档。因为在MongoDB中文档可能会在插入后增长,所有的记录是连续的磁盘上,伴随更新填充可以减少在磁盘上需要迁移的文件。迁移比就地更新效率更低,并可能导致存储碎片。其结果,所有的填充策略,是为了用额外的空间交换效率的提升,降低碎片。

不同的分配策略,支持不同类型的工作负载:2倍分配作为插入/更新/删除工作负载的效率更高;在没有更新和删除工作负载时准确适配分配对于集事来说是最合适。

双倍大小分配

2.6版本变更:对于所有新的集合,usePowerOf2Sizes成为默认的分配策略。要更改默认的分配策略,使用newCollectionsUsePowerOf2Sizes参数。

mongod用一个分配策略叫做 usePowerOf2Sizes每个记录都有一个字节大小是2的幂(例如:32,64,128,256,512......16777216)。最小分配一个文件是32个字节。双倍大小分配策略有两个关键属性:

  有数量限制的记录分配大小,这使得它更容易为mongod重用现有的分配,这将减少在某些情况下的碎片。
  在许多情况下,该记录的分配明显在于其所持有的文件。这允许文件增长并尽量减少变化或保持不变,如果文件增长mongod需要分配一个新的记录。

  该usePowerOf2Sizes策略并不排除重新分配文件作为文件增长的结果,但它在许多常见的操作中最大限度地减少其发生。

 

精确匹配分配

精确匹配分配策略分配记录大小基于文档的大小和一个额外的填充因子的记录大小。每一个集合都有自己的填充因子,默认为1,当您在集合中插入第一个文档。MongoDB动态调整填充因子为2取决于该集合生命期文档的增长速度。

估算总记录大小,计算出填充因子和文档的大小乘积:

  record size = paddingFactor * <document size>


集合中的每个记录的大小反映了填充因子在分配时的大小。参见db.collection.stats()的输出的paddingFactor查看一个集合中的当前填充因子。

平均来说,这种精确匹配分配策略比usePowerOf2Sizes策略使用更少的存储空间,但如果文件增长超过其初始分配的大小将导致更高的存储碎片。

压缩和修复数据库操作默认情况下删除填充,因为这样做mongodump和mongorestore.compact在压缩期间允许您为记录指定填充。

四、固定集合

固定集合是固定大小的集合他支持高吞吐量的操作,按插入顺序存储记录。固定集合类似工作循环缓冲区:一旦集合填满它自己的分配空间,新添加的文档将会取代集合中最旧的文档。

查看固定集合获取更多信息。

京ICP备14008139号-1