MongoDB如何处理关于单个索引和复合索引的find()。sort()查询?

时间:2015-01-02 07:56:45

标签: mongodb indexing

所以我有一个典型的find().sort()查询,我在我的mongo集合上运行。

db.collection.find({field1:1}).sort({field2:1})

现在,我说这个集合有三个索引:

  1. field1
  2. 上的单个索引
  3. field2
  4. 上的单个索引
  5. field1field2 - {field1:1,field2:1}
  6. 上的复合索引

    现在我的问题是,mongoDB如何处理上述查询?在这样的查询中将使用哪些索引 - 两个单个索引或一个复合索引?

    如果我删除复合索引,它实际上是否使用了两个单个索引但速度变慢了?

1 个答案:

答案 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索引。