复合索引可以提供多个查询

时间:2013-09-09 12:16:29

标签: mongodb

我有一个名叫工厂的集合。

在此集合中,有两种类型的查询将在名为工厂的集合中点击,如下所示

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})

1 个答案:

答案 0 :(得分: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关于存储内部。

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

以这种方式进行前缀意味着如果查询的话,索引将不起作用:

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

值得注意的是,查询中的顺序并不重要。您可以按照您喜欢的顺序创建查询中的字段,其中重要的是IN THE INDEX。

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