11

我有一个名为 factory 的集合。

在这个集合上,将有两种类型的查询将在名为factory的集合上命中 ,如下所示

db.factories.find({ city: "New York", state: "NY"} );


db.factories.find({ city: "New York", state: "NY" , country:"US"} );

我的问题是,如果我创建一个如下所示的复合索引,它会同时服务于两个查询吗?

db.factories.ensureIndex({city:1,state:1,country:1},{"unique" : false})
4

1 回答 1

6

是的。

要理解为什么答案是肯定的,我们需要讨论复合索引是如何实际构建的。

复合索引中的字段从第一个到最后一个,其中包含嵌套在父级中的所有子级的值。这意味着如果您有三个文件,例如:

[{
    _id:{},
    a: 1,
    b: 2,
    c: 3
},{
    _id:{},
    a: 4,
    b: 5,
    c: 6
},{
    _id:{},
    a: 7,
    b: 8,
    c: 9
}]

并做了一个索引:

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

索引实际上看起来像:{1: [2,3]}第一个值是最左边的字段,另外两个是出现在最左边的值下的值。

当然这不是索引的实际外观,我这样做只是为了让每个人都可以阅读。要了解索引实际上是如何形成的,您可以观看一些演示文稿,我认为始终可以观看的一个很好的是:http ://www.mongodb.com/presentations/storage-engine-internals on storage internals。

所以这意味着 MongoDB 通过前缀方法来选择这个索引,它会说aa,b是索引的前缀,它可以使用这些字段从索引中获取所有其他需要的值。

以这种方式添加前缀意味着如果您查询以下内容,索引将不起作用:

db.collection.find({state:"NY",country:"YS"});
db.collection.find({state:"NY"});
db.collection.find({country:"YS"});

值得注意的是,查询中的顺序并不重要。您可以使查询中的字段按您喜欢的任何顺序排列,重要的是在索引中。

无论如何,这是查询将使用该单个索引的原因的入门。

于 2013-09-09T13:03:24.167 回答