mongo查询不触发复合索引



我有几十万个这样的文档:

{
"field_id" : "abcd",
"aField" : 0,
"parentList": [
{
"field": "value1",
"list": ["element1,element2"]
}
, 
{
"field": "value2",
"list": ["element1, element3"]
}
]
}

(这是我数据库中一个更大文档的过度放大版本,包含更多字段。数据库包含数百万个文档(。这是我想用于计数执行的过滤器:

{ 'parentList.0.list': 
{ '$in': 
[ 'element1',
'element2',
'element3',
'element4' 
] 
},
aField: { '$ne': 1 },
field_id: { '$in': [ 'abcd' ] } 
}

我想做的是创建一个这样的索引:

{"field_id" : 1, "parentList.list" :1, "aField" : 1}

并让查询使用它。但mongo实际上忽略了它。相反,mongo使用了另一个索引,即

{"field_id":1, "anotherField":1}

执行统计数据显示了这个阶段:

  1. IXSCAN对{"field_id":1,"anotherField":1}索引,生成500k个keyExamined,即field_id="abcd"的500k个文档
  2. FETCH滤波器的其余部分,返回20k作为计数

当然,如果mongo使用了正确的索引,我希望它已经从IXSCAN检索到了2万个文档,或者至少是一个更接近这个数字的数字。

我只是不明白mongo为什么不使用那个索引。我还试图更改索引中字段的顺序,但没有成功。我正在使用Mongo 4.4.6

Mongo有时会使用错误的索引,我建议您阅读我在这里的答案,它解释了为什么会发生这种情况。

为了";"修复";您应该使用$hint的行为,它将强制Mongo使用您指定的特定索引。

这个索引是吗

{"field_id":1, "anotherField":1}

适用于针对数据库的大多数查询?

根据我的经验,MongoDB通常会选择一个非常通用的索引,即使有时更具体的索引更好。我通过使索引更具体地用于它们的用途(并删除"catch-all"索引(来解决这个问题。我不知道这是否适用于您的用例,因为所选索引的原因尚不清楚。

已解决

所以这其实很容易解决。MongoDB Compass不允许我在数组的某个位置创建索引(在本例中为parentList.0.list(,因为当我尝试插入它时,它会自动用parentList.list替换它。最终,我发现,如果在shell中进行索引,那么对数组的某个位置进行索引实际上是可行的。所以我在parentList.0.list上创建了索引,该索引运行良好。就是这样。希望这也能帮助其他人。

相关内容

  • 没有找到相关文章

最新更新