据我所知,WiredTiger压缩期刊,collections和索引。 当它们存储在RAM中时,它是否也压缩它们?
例如,如果我的压缩指数在磁盘上使用10 MiB,我可以假设他们也使用10 MiB的RAM? 或者我应该期望在RAM中有更大的未压缩索引?
WiredTiger在磁盘和内存中具有不同的数据表示forms,对索引和收集数据使用不同的压缩方法。
关于内存压缩的答案有些微妙,但高层次的总结是:
默认情况下,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与磁盘上的表示相同。
请注意,WiredTigercaching并不代表MongoDB的总内存使用情况: mongod仍然需要为caching之外的内存分配其他用途,例如连接和数据处理(例如聚合,映射/减less,内存中sorting)。
WiredTiger内部caching通常应该保持默认的大小或可能减less。 如果数据压缩良好,而且未压缩的数据比RAM大得多,则可以通过减lessWiredTigercaching大小来释放文件系统caching的内存,从而使整个RAM中的数据更加丰富。 MongoDB手册中有更多信息的FAQ: 我应该设置WiredTiger内部caching的大小? 。
有关更多背景信息,build议您查看MongoDB 3.0博文中的新压缩选项和WiredTiger演示文稿的技术介绍 。