我有一个系列"帖子"我在这个集合中索引了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作为索引键?
答案 0 :(得分:0)
Mongo不使用author_id进行查询,因为它不属于任何索引前缀
举一个例子,如果你有这样的复合索引
{ "item": 1, "location": 1, "stock": 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
进行了许多查询,那么添加其他索引也是个好主意。