【问题标题】:Which index would be used if there are multiple indexes containing the same fields?如果有多个索引包含相同的字段,将使用哪个索引?
【发布时间】:2014-07-13 07:18:35
【问题描述】:

find() 为例,它按顺序涉及字段ab。例如,

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}})

我的集合索引数组中有两个键:

[
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1"
},
{
    "v" : 1,
    "key" : {
        "a" : 1,
        "b" : 1,
        "c" : 1
    },
    "ns" : "x.test",
    "name" : "a_1_b_1_c_1"
}
]

保证 mongo 将使用第一个键,因为它更准确地匹配查询,还是随机选择两个键中的任何一个,因为它们都可以工作?

【问题讨论】:

  • 可以向我们展示您的索引吗?
  • 用实际数组更新了我的问题(之前认为没有必要)
  • 值得注意的是,您可以删除您的第一个索引 (a_1_b_1),因为它是第二个索引的适当子集(相同的键和顺序),可用于满足相同的查询。重复索引是不必要的开销。
  • 是的,这只是一个关于 MongoDB 如何工作的理论问题。我意识到这会使写入速度变慢等

标签: mongodb mongodb-query mongodb-indexes


【解决方案1】:

MongoDB 有一个查询优化器,可以选择最有效的索引。来自docs

MongoDB 查询优化器处理查询并选择最 给定可用索引的查询的有效查询计划。

所以它不是严格保证的(但我希望较小的索引会比较大的复合索引更快地产生结果)。 您也可以使用hint 运算符来强制查询优化器使用指定的索引。

db.collection.find({'a':{'$lt':10},'b':{'$lt':5}}).hint({a:1, b:1});

但是,您示例中的这两个索引是多余的。这是因为复合索引支持对任何 prefix of index 字段的查询。

以下索引:

db.collection.ensureIndex({a: 1, b: 1, c: 1});

可以支持包括aababc的查询,但只支持bc,或仅bc

【讨论】:

  • 是的,我意识到冗余......我只是好奇 IF 两者都存在,会选择什么(你回答了)。
【解决方案2】:

你和使用$exist,,当为true时,$exists匹配包含该字段的文档,包括字段值为null的文档。如果为 false,则查询只返回不包含该字段的文档。

$exist

查询将是

db.inventory.find( { "key.a": { $exists: true, 1 },"key.b": { $exists: true, 1 }  } )

【讨论】:

  • 我认为您可能误解了我的问题(或者我的答案)...我想知道将使用哪个索引...第一个键的索引或第二个键的索引, 在 findsort 命令正在执行的情况下。
  • key 是集合具有的索引数组中的一个字段。就像我说db.collection.ensureIndex({a:1,b:1})
  • key是数组还是json文档..的集合?
  • 它是db.collection.getIndexes()输出的一部分
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2010-09-17
  • 2023-04-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多