Database 第二个索引键的阶段为;COLLSCAN";在Mongodb

Database 第二个索引键的阶段为;COLLSCAN";在Mongodb,database,mongodb,indexing,Database,Mongodb,Indexing,我有一个“Posts”集合,我在该集合中索引了2个键: "has_checked" : Array , "author_id" : String 当我尝试使用“has_checked”查找时,它很好,并且在模式explain(“executionStats”)中显示: "stage" : "IXSCAN" , "totalDocsExamined" : 1 "totalDocsExamined" : 36988, "stage" : "COLLSCAN", "filter" : {

我有一个“Posts”集合,我在该集合中索引了2个键:

"has_checked" : Array ,
"author_id"   : String
当我尝试使用“has_checked”查找时,它很好,并且在模式explain(“executionStats”)中显示:

"stage" : "IXSCAN" ,
"totalDocsExamined" : 1
"totalDocsExamined" : 36988,
"stage" : "COLLSCAN",
   "filter" : {
      "author_id" : {
         "$eq" : "597a2f9273519a27769f1b30"
       }
    }
但当我尝试用“作者id”查找时,它会显示:

"stage" : "IXSCAN" ,
"totalDocsExamined" : 1
"totalDocsExamined" : 36988,
"stage" : "COLLSCAN",
   "filter" : {
      "author_id" : {
         "$eq" : "597a2f9273519a27769f1b30"
       }
    }
这是“db.posts.getIndexes()的结果”

]


为什么不使用author\u id作为索引键?

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

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

{ "item": 1, "location": 1, "stock": 1 }
索引具有以下索引前缀:

  • {项目:1}
  • {项目:1,位置:1}
对于复合索引,MongoDB可以使用该索引来支持对索引前缀的查询。因此,MongoDB可以使用索引查询以下字段

  • 项目字段
  • 项目字段和位置字段
  • 项目字段、位置字段和库存字段
MongoDB还可以使用索引来支持对item和stock字段的查询,因为item字段对应于前缀。但是,索引在支持查询方面的效率不如仅针对商品和库存的索引


您可以按照此操作了解更多详细信息

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

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

{ "item": 1, "location": 1, "stock": 1 }
索引具有以下索引前缀:

  • {项目:1}
  • {项目:1,位置:1}
对于复合索引,MongoDB可以使用该索引来支持对索引前缀的查询。因此,MongoDB可以使用索引查询以下字段

  • 项目字段
  • 项目字段和位置字段
  • 项目字段、位置字段和库存字段
MongoDB还可以使用索引来支持对item和stock字段的查询,因为item字段对应于前缀。但是,索引在支持查询方面的效率不如仅针对商品和库存的索引

您可以按照下面的内容查看更多详细信息

[
    {
            "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"
    }

]
我们可以看到两件事:

默认索引是
\u id
,不能删除。(有关更多信息,请参阅)

无法删除_id字段上的默认索引

您的第二个索引是
已按升序检查
,以及
所有者id
也按升序检查

不过,复合索引的名称很不幸<代码>“姓名”:“是否已选中作者id”
这只是索引名,并不意味着索引也需要。通常情况下,如果不总是匹配的关键,但由于我们只是人类,错误发生

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

我还建议将其从
“has\u checked\u author\u id\u 1”
重命名为
“has\u checked\u owner\u id\u 1”
。如果您正在对
作者id
进行许多查询,那么添加另一个索引也是一个好主意

根据您发布的内容

[
    {
            "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"
    }

]
我们可以看到两件事:

默认索引是
\u id
,不能删除。(有关更多信息,请参阅)

无法删除_id字段上的默认索引

您的第二个索引是
已按升序检查
,以及
所有者id
也按升序检查

不过,复合索引的名称很不幸<代码>“姓名”:“是否已选中作者id”
这只是索引名,并不意味着索引也需要。通常情况下,如果不总是匹配的关键,但由于我们只是人类,错误发生

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

我还建议将其从
“has\u checked\u author\u id\u 1”
重命名为
“has\u checked\u owner\u id\u 1”
。如果您正在对
作者id
进行许多查询,那么添加另一个索引也是一个好主意