第二个索引键具有" COLLSCAN"在Mongodb

时间:2017-11-25 14:51:38

标签: database mongodb indexing

我有一个系列"帖子"我在这个集合中索引了2个键:

"has_checked" : Array ,
"author_id"   : String

当我尝试使用" has_checked"它很好,在模式解释(" executionStats")它告诉我:

"stage" : "IXSCAN" ,
"totalDocsExamined" : 1

但是当我试图找到" author_id"它告诉我:

"totalDocsExamined" : 36988,
"stage" : "COLLSCAN",
   "filter" : {
      "author_id" : {
         "$eq" : "597a2f9273519a27769f1b30"
       }
    }

这是" db.posts.getIndexes()"

[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "name" : "_id_",
            "ns" : "mydb.posts"
    },
    {
            "v" : 1,
            "key" : {
                    "has_checked" : 1,
                    "owner_id" : 1
            },
            "name" : "has_checked_1_author_id_1",
            "ns" : "mydb.posts"
    }

为什么它不使用author_id作为索引键?

2 个答案:

答案 0 :(得分:0)

Mongo不使用author_id进行查询,因为它不属于任何索引前缀

举一个例子,如果你有这样的复合索引

{ "item": 1, "location": 1, "stock": 1 }

索引具有以下索引前缀:

  • {item:1}
  • {item:1,location:1}

对于复合索引,MongoDB可以使用索引来支持对索引前缀的查​​询。因此,MongoDB可以在以下字段中使用索引进行查询

  • 项目字段
  • 项目字段和位置字段
  • 项目字段,位置字段和库存字段。

MongoDB还可以使用索引来支持对项目和库存字段的查询,因为项目字段对应于前缀。但是,索引在支持查询方面效率不高,因为只有项目和股票的索引。

您可以按照此https://docs.mongodb.com/manual/core/index-compound/#prefixes获取更多详细信息

答案 1 :(得分:0)

根据您发布的内容

[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "name" : "_id_",
            "ns" : "mydb.posts"
    },
    {
            "v" : 1,
            "key" : {
                    "has_checked" : 1,
                    "owner_id" : 1
            },
            "name" : "has_checked_1_author_id_1",
            "ns" : "mydb.posts"
    }

]

我们可以看到两件事:

您的默认值为_id并且无法删除。 (有关详细信息,请参阅here

  

您不能删除_id字段的默认索引。

您的第二个索引是has_checked升序,owner_id升序。

虽然复合指数的名称很不幸。 "name" : "has_checked_1_author_id_1" 这只是索引名称,并不代表索引也是必要的。它通常如果不总是与键匹配,但由于我们只是人类,所以会发生错误。

下次检查密钥而不是名称。名称应该是,但并不总是代表实际的索引键。

我还建议将其从"has_checked_1_author_id_1"重命名为"has_checked_1_owner_id_1"。如果您对author_id进行了许多查询,那么添加其他索引也是个好主意。