mongo查询不触发复合索引

问题描述 投票:0回答:3

我有数十万份这样的文档:

    {
  "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. 对 {"field_id":1, "anotherField":1} 索引进行 IXSCAN,生成 500k 个键检查,这是具有 field_id = 'abcd' 的 500k 文档
  2. 获取过滤器的其余部分,返回 20k 作为计数

当然,如果 mongo 使用正确的索引,我希望它能够从 IXSCAN 检索 20k 文档,或者至少更接近这个数字。

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

mongodb indexing mongodb-query compound-index
3个回答
0
投票

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

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


0
投票

这个索引吗

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

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

根据我的经验,MongoDB 通常会选择非常通用的索引,即使有时更具体的索引更好。我通过使索引更具体地适应其用途(并删除“包罗万象”的索引)来解决这个问题。我不知道这是否适用于您的用例,因为所选索引的原因尚不清楚。


0
投票

所以这个问题其实很容易解决。 MongoDB Compass 不允许我在数组的某个位置(在本例中为parentList.0.list)创建索引,因为当我尝试插入它时,它会自动将其替换为parentList.list。

最终,我发现如果在 shell 中完成,在数组的某个位置上建立索引实际上是可行的。所以我在parentList.0.list上创建了索引,并且索引工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.