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})
现在,假设我在这个集合上有三个索引:
field1
上的单个索引
field2
上的单个索引
field1
和 field2
上的复合索引 - {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
索引也是如此。
所以我在 mongo 集合上运行了一个典型的 find().sort()
查询。
db.collection.find({field1:1}).sort({field2:1})
现在,假设我在这个集合上有三个索引:
field1
上的单个索引
field2
上的单个索引
field1
和field2
上的复合索引 -{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
索引也是如此。