Database 第二个索引键的阶段为;COLLSCAN";在Mongodb
我有一个“Posts”集合,我在该集合中索引了2个键: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" : {
"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}
- 项目字段
- 项目字段和位置字段
- 项目字段、位置字段和库存字段
您可以按照此操作了解更多详细信息Mongo不使用author\u id进行查询,因为它不属于任何索引前缀 举个例子,如果你有这样一个复合索引
{ "item": 1, "location": 1, "stock": 1 }
索引具有以下索引前缀:
- {项目:1}
- {项目:1,位置:1}
- 项目字段
- 项目字段和位置字段
- 项目字段、位置字段和库存字段
[
{
"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
进行许多查询,那么添加另一个索引也是一个好主意