所以我有一个典型的find().sort()
查询,我在我的mongo集合上运行。
db.collection.find({field1:1}).sort({field2:1})
现在,我说这个集合有三个索引:
field1
field2
field1
和field2
- {field1:1,field2:1}
现在我的问题是,mongoDB如何处理上述查询?在这样的查询中将使用哪些索引 - 两个单个索引或一个复合索引?
如果我删除复合索引,它实际上是否使用了两个单个索引但速度变慢了?
答案 0 :(得分:3)
如果我明白你的意思,这可能会有所帮助:
假设您有样本
的这些文件{
field1 : 1,
field2 : 2,
},
{
field1 : 2,
field2 : 3,
},
{
field1 : 1,
field2 : 4,
}
第1步:您的索引仅适用于 filed1 (索引名称 field1_1 )}:
执行:db.test3.find({field1:1}).sort({field2:1})
mongo使用 field1_1 索引在文档中搜索。 .explain()的结果是:
"cursor" : "BtreeCursor field1_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
第2步:添加您的复合索引,将其命名为 field1_1_field2_1 ,现在您有2个字段1的索引。
执行find().sort()
查询,您将拥有
"cursor" : "BtreeCursor field1_1_field2_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
<强> Concolusion:强>
如果您使用db.test3.find({field1:1}).sort({field2:1})
,则mongo将使用field1_1_field2_1
索引。
如果您使用db.test3.find({field1:1})
,则mongo将使用field1_1
索引。
我的情况,如果你只有 field1_1_field2_1 索引并且你正在执行db.test3.find({field1:1})
,那么mongo也会使用field1_1_field2_1
索引。