mongodb 中的集合扫描是什么?

n3w*_*3wb 6 mongodb mongodb-query

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

Nei*_*unn 10

简而言之,这两个术语是相同的,或者更确切地说,只有“完整集合扫描”。

如果您的查询使用 B 树游标,则根据定义,它不会扫描集合,而是会遍历索引以查找查询的文档。

当没有索引可以满足查询时,就会发生集合扫描,我们必须扫描整个集合 才能找到所需的文档。请参阅链接以获取所有信息。

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


Wor*_*ine 6

集合扫描实际上就是扫描整个集合。当用户请求使用某些无法使用索引回答的条件查找文档时,就会发生这种情况。例如,我们有一个用户集合,其中包含姓名、年龄、头发颜色、地址、电话号码和国家/地区等字段

user = {"name" : "ABC",
         "age" : 25,
         "hair color" : "brown",
         "address" : "XYZ",
         "phone number" : 1234567890,
         "country" :"Canada"
       }
Run Code Online (Sandbox Code Playgroud)

此外,如果我们有名称索引并使用以下命令查询数据库:

 db.users.find({"name" : "ABC"});
Run Code Online (Sandbox Code Playgroud)

由于我们在名称字段上有索引,因此查询优化器将使用索引作为性能优化方法。

假设您在数据库中查询其他字段。可以说地址

db.users.find({"address" : "XYZ"});
Run Code Online (Sandbox Code Playgroud)

这里,查询优化器希望缩短查询的响应时间,但由于它没有关于集合中记录的先验信息,因此它必须遍历集合中的每个文档以查看该文档的地址字段是否与查询中的一项。如果是,那么我们会返回该文档。我确信您知道这就是索引的用武之地,因为它通过根据某些标准“分组”文档来维护指针。

欲了解更多信息,您可以查看这里

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

即使正在查询的字段上存在索引,您也可以强制它执行集合扫描。你可以在这里读到它