2014-02-10 81 views
1

我知道什么是“全集扫描”。但是我有点不确定术语“集合扫描”是否适用于使用B-树游标的查询。使用除基本游标以外的游标的查询是否执行集合扫描?什么是MongoDB中的集合扫描?

回答

2

简短的答案是两个术语是相同的,或者说,只有“全面收集扫描”。

如果您的查询使用B树光标它是由定义扫描收集看跌期权遍历指数,以便找到所查询的文档。

一个收集扫描发生在没有指标能满足查询,我们必须扫描全额征收,以便找到所需文件。查看所有信息的链接。

http://docs.mongodb.org/manual/reference/method/cursor.explain/

+1

“如果您的查询使用B树光标它是由定义不扫描集合” - 是它始终是真的吗?例如; B树光标只能用于'排序'阶段,并且查询仍可能最终为'查找'阶段执行集合扫描。 – aquaraga

2

集合扫描就是从字面上扫描整个集合。当用户请求使用某些无法使用索引进行回答的条件查找文档时,会发生这种情况。 比如让说,我们有一个用户收集与领域,如姓名,年龄,头发的颜色,地址,电话号码和国家

user = {"name" : "ABC", 
     "age" : 25, 
     "hair color" : "brown", 
     "address" : "XYZ", 
     "phone number" : 1234567890, 
     "country" :"Canada" 
     } 

而且,如果我们有一个同名的索引和数据库使用查询,

db.users.find({"name" : "ABC"}); 

在这里,由于我们在名称字段上有一个索引,所以查询优化器将使用该索引作为性能优化方法。

假设您查询其他字段的数据库。比方说,解决

db.users.find({"address" : "XYZ"}); 

这里查询优化很想缩短响应时间查询,但由于它具有对集合中的记录中没有任何先验信息,它要经过的每一个文件该集合查看该文档的地址字段是否与查询中的地址字段匹配。如果确实如此,那么我们将返回该文档。我相信你知道这是索引的来源,因为它通过按照特定标准对文档进行“分组”来维护指针。

欲了解更多信息,你可以看看here

对于您的问题,使用B树游标的查询会避免执行集合扫描,因此使用除基本游标“主要”之外的任何类型的游标进行查询都可避免集合扫描。

即使在正在查询的字段上存在索引,也可以强制执行收集扫描。你可以阅读有关它here

相关问题