mongodb - 如果有多个索引包含相同的字段,会使用哪个索引?

标签 mongodb mongodb-query mongodb-indexes

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 将使用第一个 key ,因为它更准确地匹配查询,或者它是否随机选择两个 key 中的任何一个,因为它们都可以工作?

最佳答案

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

The MongoDB query optimizer processes queries and chooses the most efficient query plan for a query given the available indexes.

所以这并不能得到严格保证(但我预计较小的索引会比较大的复合索引更快地产生结果)。 您还可以使用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});

可以支持包含aab以及ab的查询code> 和 c,但只有 bc,或者只有 bc

关于mongodb - 如果有多个索引包含相同的字段,会使用哪个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720412/

相关文章:

Mongodb compass 当文档包含错误时不允许插入

node.js - Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值

mongodb - 使用 MongoDB 聚合将不同属性的值合并到单个数组中

javascript - mongoDB 数据库探查器查询和获取更多选项

javascript - 尝试使用 MongoDB 搜索符合条件的记录时出错

arrays - 如何在 mongodb 中更新多个数组元素

MongoDB——通过多个键查找重复文档

MongoDB 拒绝使用索引交集

MongoDB操作顺序和变化的获胜方案