我可以存储不会影响MongoDB查询性能的数据吗?

时间:2017-07-23 15:08:49

标签: mongodb performance binary-data

我们有一个应用程序需要保存应该在文档中的数据,用于查询和排序。数据应该是模式较少的,因为某些字段只能通过使用来知道。为此,MongoDB是一个很好的解决方案,它对我们很有用。

每个文档中的部分数据用于显示目的。这意味着数据可以是客户端用来绘制图表的对象(让我们说json)。

我尝试使用gridfs保存这些数据,但用例使其响应不够。此外,即使文档中包含图表数据,文档也不会超过16 MB的限制。事实上,在尝试直接在文档中保存这些数据时,我们得到了更好的结果。

此数据仅用于客户端响应,这意味着我们永远不应该查询它。所以我的问题是,我可以将此数据插入MongoDB,并将其设置为“不是查询”。数据?意思是,我可以在不影响Mongo性能的情况下插入这些数据吗?数据是严格的,一旦插入文档,可能只更新现有字段,而不是添加新字段。

我注意到Mongo中存在二进制数据类型,我想知道是否应该将此类型用于非二进制的对象。这能否给我提供我想要的东西? 另外,我很想知道在我的文档中使用这种类型有什么好处。它可以节省我的磁盘空间吗?

1 个答案:

答案 0 :(得分:0)

与MongoDB 3.4一样,从存储/内存的角度来看,读写操作在单个文档的级别上是原子的。如果MongoDB服务器需要从内存或磁盘中获取文档(即使projecting a subset of fields to return),则通常必须将完整文档加载到mongod的内存中。唯一的例外是,如果您可以take advantage of covered queries返回的所有字段也包含在所使用的索引中。

  

此数据仅用于客户端响应,这意味着我们永远不应该查询它。

不直接查询的数据字段不需要在任何索引中。但是,目前还没有类似"不适用于查询" MongoDB中的字段。您可以查询或投影任何字段(带或不带索引)。

  

意思是,我可以在不影响Mongo性能的情况下插入此数据吗?

具有非常不同的访问或增长模式的数据(例如您不经常请求的客户端数据)是建议的候选者,用于与具有频繁访问的数据的父文档分开存储。这样可以避免在处理父集合中的文档时不必要的数据检索,从而提高mongod的内存使用效率。

  

我注意到Mongo中存在二进制数据类型,我想知道是否应该将此类型用于非二进制的对象。这能否给我提供我想要的东西?另外,我很想知道在我的文档中使用这种类型有什么好处。它可以节省我的磁盘空间吗?

您应该使用最适合您存储的数据的类型。将文本数据存储为二进制文件不会在服务器存储中获得任何明显的效率。但是,将复杂对象存储为单个值(例如,序列化为字符串的JSON文档)可以节省一些序列化开销,如果该对象仅通过客户端代码进行解释。存储在MongoDB中的二进制数据就索引或查询而言将是一个不透明的blob,这听起来很合适。