MongoDB 3.2 WiredTiger压缩包括存储在RAM中的东西吗?

据我所知,WiredTiger压缩期刊,collections和索引。 当它们存储在RAM中时,它是否也压缩它们?

例如,如果我的压缩指数在磁盘上使用10 MiB,我可以假设他们也使用10 MiB的RAM? 或者我应该期望在RAM中有更大的未压缩索引?

WiredTiger在磁盘和内存中具有不同的数据表示forms,对索引和收集数据使用不同的压缩方法。

关于内存压缩的答案有些微妙,但高层次的总结是:

  • 收集数据在文件系统caching中被压缩
  • 收集数据在WiredTiger内部caching中解压缩
  • 索引被压缩在磁盘和内存中

压缩方法

默认情况下,WiredTiger对收集数据使用Snappy块压缩,但还有其他选项可用,包括zlib压缩或不压缩。 数据块压缩可以节省大量存储空间,但数据必须解压才能被服务器操纵。 不考虑压缩选项,数据仍然以与WiredTigercaching中的内存中表示forms不同的块格式写入磁盘。

索引使用索引前缀压缩进行压缩,从而有效地从索引字段中删除通用前缀。 对于复合索引,这可能特别有效,因为前导字段值将以索引中其他字段的唯一值重复。 前缀压缩还允许查询直接在压缩索引上运行。

内存中压缩了什么?

在MongoDB 3.4中(包括之前的WiredTiger的MongoDB版本),RAM中有两个重要的数据caching:

  • WiredTiger内部caching,由cacheSizeGBconfiguration设置控制 。

    MongoDB 3.4中的默认caching大小是内存的50%,小于1GB或256MB。 内部caching中的收集数据是未压缩的,但是索引数据仍然使用前缀压缩。 内部WiredTigercaching中的数据实际上是当前的工作集 。

  • O / S文件系统caching,通常是WiredTigercaching或其他进程不使用的可用RAM的其余部分。

    文件系统caching与磁盘上的表示相同。

caching调优

请注意,WiredTigercaching并不代表MongoDB的总内存使用情况: mongod仍然需要为caching之外的内存分配其他用途,例如连接和数据处理(例如聚合,映射/减less,内存中sorting)。

WiredTiger内部caching通常应该保持默认的大小或可能减less。 如果数据压缩良好,而且未压缩的数据比RAM大得多,则可以通过减lessWiredTigercaching大小来释放文件系统caching的内存,从而使整个RAM中的数据更加丰富。 MongoDB手册中有更多信息的FAQ: 我应该设置WiredTiger内部caching的大小? 。

有关更多背景信息,build议您查看MongoDB 3.0博文中的新压缩选项和WiredTiger演示文稿的技术介绍 。