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

How does MongoDB treat find().sort() queries with respect to single and compound indexes?

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

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

现在,假设我在这个集合上有三个索引:

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

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

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

如果我明白你的意思,这可能会有所帮助:

假设您有这些样本文件

{
    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,现在字段 1 有 2 个索引。

执行find().sort()查询,你将

"cursor" : "BtreeCursor field1_1_field2_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,

结论:

如果您使用 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 索引也是如此。