【问题标题】:How does MongoDB treat find().sort() queries with respect to single and compound indexes?MongoDB 如何处理关于单索引和复合索引的 find().sort() 查询?
【发布时间】:2015-01-02 16:29:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: mongodb indexing


【解决方案1】:

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

假设您有这些文件作为样本

{
    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 索引。

【讨论】:

  • 这是一个完美的描述,为什么如果字段已经在复合索引中被索引,则使用单个字段索引没有意义。
  • @MarkusWMahlberg 是的,虽然我更担心没有复合索引 :-)
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2018-06-02
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多