MongoDb查询和indexOnly = false

时间:2014-03-22 18:11:10

标签: mongodb

执行下一个查询(包含字段:{_ id:1}):

{ 
  "namespace": "default", 
  "active": true, 
  "searchable": true, 
  "type": "H",
  "keywords.extended": /^a/, 
}

在包含2.200.000文档(匹配命名空间200.000文档)和类似文档的集合中

{
  "active" : true,
  "keywords" : {
    "extended" : ["lorem", "ipsum", "sit", "amet"]
  },
  "namespace" : "rsvcom",
  "searchable" : true,
  "type" : "H"
}

使用索引:

{ 
  "namespace": 1, 
  "active": 1, 
  "searchable": 1, 
  "type": 1, 
  "keywords.extended": 1 
}

我永远不会让 indexOnly = true 执行"找到"或"计数"。

  1. 我可以优化查询此集合的方式吗?
  2. 可以进行仅使用索引且不到1毫秒的计数吗?
  3. 以下是限制为5000的解释:

    explain

3 个答案:

答案 0 :(得分:2)

由于以下三个原因,你不会得到一个indexOnly解释:

  1. 您没有指定只返回索引中的字段。涵盖索引查询必须具有投影,以便索引既可用于过滤,也可用于获取查询的值。

  2. 您正在使用multiKey索引。您不能像MongoDB中那样拥有indexOnly查询。多重索引不包含有关哪个字段是数组的信息,因此需要查找文档。

  3. 您在文档/查询中嵌入了字段。 MongoDB无法从索引中确定嵌入字段是子文档还是数组元素,因此它必须自己查找文档。

  4. 另一个原因是,这不是一个特别快速的查询 - 您正在使用正则表达式。虽然左锚定的正则表达式将能够使用索引(正则表达式是最后一个字段),但它不会像查找一样快速查找(与范围查询不同于等式的效率相同)查询)。

答案 1 :(得分:1)

将结果投影为仅返回属于索引的字段。

只有当您执行从结果中删除不属于索引的所有字段的投影时,才会获得覆盖索引indexOnly = true;在您的情况下,例如,subdoc字段(关键字)。说明:当索引完全确定查询结果时,可以获得indexOnly = true,这意味着查询返回的所有数据都可以仅使用索引完全计算。

在您的特殊情况下,有两件事可能会阻止它: - 如果你不进行投影,mongo不会预先知道除了数组之外的子网中没有其他字段;无架构数据库。 - 即使mongo new没有其他字段,我也不确定从索引计算数组字段会比从数据库中选择完整文档更便宜(在计算方面)。无论如何,我不知道mongo在这种情况下是怎么做的。

答案 2 :(得分:0)

修改 如下面评论中的 @Sammaye 所述,覆盖的索引不适用于虚线字段,如JIRA Ticket

中所述

那是因为,查询可能也会在结果中获得_id运算符。尝试修改查找查询以包含投影条件,以明确包含结果中所需的字段并禁止_id字段:

db.collection.find(
{ 
  "namespace": "default", 
  "active": true, 
  "searchable": true, 
  "type": "H",
  "keywords.extended": /^a/ 
},
{ 
  _id : 0,
  "namespace": 1, 
  "active": 1, 
  "searchable": 1, 
  "type": 1,
  "keywords.extended": 1 
}
)