据我所知,explain()方法中的nscannedObjects条目表示MongoDB需要在磁盘中查找的文档数。
我的问题是:当这个值为0时,除了上面的解释之外,这实际意味着什么? MongoDB是否保留了存储在那里的一些文档的缓存?
答案 0 :(得分:1)
nscannedObjects = 0表示没有提取或过滤来满足您的查询,查询仅基于索引解析。因此,例如,如果您要查询{_id:10}
并且没有匹配的文档,则会获得nscannedObjects = 0.
它与内存中的数据无关,查询计划没有这样的区别。
请注意,在MongoDB 3.0及更高版本中,nscanned和nscannedObjects现在称为totalKeysExamined和totalDocsExamined,这更加不言自明。
答案 1 :(得分:0)
Mongo是一个文档数据库,这意味着它可以解释存储文档的结构(与示例键值存储不同)。
该方法的一个特殊优点是您可以在数据库中的文档上构建索引。
索引是一种数据结构(通常是b-tree的变体),允许基于其某些属性快速搜索文档(例如id
(!= _id)
或其他一些这些通常存储在内存中,可以非常快速地访问它们。
当您根据索引属性搜索文档时(让我们说id
> 50),那么mongo不需要从内存/磁盘/其他任何内容中获取文档 - 它可以看看哪些文档完全基于索引符合标准(请注意,从磁盘中获取内容比内存查找慢几个数量级,即使没有缓存也是如此)。实际进入磁盘的唯一时间是您需要获取文档以进行进一步处理(并且您所引用的统计信息不包含该文档)。
指数对于实现高性能至关重要,但也有缺点(例如很少使用索引可以减慢插入速度而不值得 - 每次插入后索引都必须更新)。