2011-03-09 65 views
18

这个问题的关注内部的方法来管理指标和serching BSON文档。MongoDB:索引的顺序和查询顺序必须匹配吗?

当你创建了“索引1”,“索引2”,“INDEX3”多重索引...索引存储在查询时使用,但对于查询的顺序和所产生的效果。

样品
index1之间索引2,INDEX3 ---->查询以相同的顺序索引1,索引2,INDEX3(最好情况)以另一顺序索引2 index1之间索引2,INDEX3 ---->查询,index1之间INDEX3(改变顺序)

很多时候,你使用嵌套查询,包括这3个指标和其他物品或多个索引。查询的顺序会牵涉到一些时间的损失?必须通过关于索引定义的查询或内部架构来关注此订单搜索?我寻找知道我是否关心这个问题,或者可以让我更自由地询问问题。

谢谢。

+0

我将删除'mongodb-csharp'标签:这是一个关于后端索引的问题。 – 2011-03-09 12:52:32

回答

32

的查询条件的顺序不影响其是否可以使用索引或没有。

例如 典型的文档结构:

{ 
    "FieldA" : "A", 
    "FieldB" : "B" 
} 

如果你有一个的复合索引和B:

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1}) 

然后下面两个查询都将能够使用该索引:

db.MyCollection.find({FieldA : "A", FieldB : "B"}) 
db.MyCollection.find({FieldB : "B", FieldA : "A"}) 

所以正在使用的查询并不会阻止索引条件的顺序 - 我认为这是你问的问题。

您可以通过在shell中尝试2个查询并在查找后添加.explain()来轻松地进行测试。我刚刚做了这个确认,他们都表明使用了复合指数。

但是,如果您运行下面的查询,这将不会使用索引作为FIELDA没有被上查询:

db.MyCollection.find({FieldB : "B"}) 

所以它在定义它是否能够索引的字段的顺序由查询使用,而不是查询本身的字段顺序(这是卢卡斯所指的)。

+2

这里要注意的重要一点是,查询中的顺序并不重要,但索引中定义的字段的顺序确实如此。 – 2011-03-09 18:01:09

+1

但是,如何在定义索引时指定顺序? ensureIndex将一个JS对象作为参数,并且字段JS对象不是有序的。 (Hi Scott!) – Leopd 2011-09-23 23:52:31

+4

@Leopd:它们没有按照规范排序,但它们“恰巧”是在实现中排序的,而MongoDB依赖于此行为。这是MongoDB中更令人不快的设计瑕疵之一,并导致大多数其他语言的hoop跳跃(因为大多数字典类型*不*订购)。 – 2012-04-16 13:34:05

9

http://www.mongodb.org/display/DOCS/Indexes

如果您对 多个领域的复合指数,你可以用它来 查询上 领域的开始子集。所以,如果你有

A,B指数,C

,你可以使用它在

一个

查询,B

A,B,C

所以,是的,订购事宜。如果您需要更准确的答案,您应该澄清一下您的问题。

+0

b,a或b,c,a或c,b,a。你谈论你可以查询,但这是知道的,我要求专门讨论将提交给索引器的查询顺序。 var quer = Query.AND(Query.EQ(“B”,b),Query.EQ(“A”,a)),query = Query.Or(query,Query.EQ(“C”,c))。内部将拒绝A,B,C或将丢失B,A,C。 – user325558 2011-03-09 12:59:50

+0

通过这个评论,并假设一个索引(A,B,C),我假设你问的是查询优化器是否能够将(B,C,A)上的示例查询重新排列为(A,B,C)以便使用索引。答案是肯定的,这可以通过使用'explain'(如@AdaTheDev指出的)很容易确定。注意:至少在1.8.0rc1上这是真的 - 在以前的版本中没有测试过。 – 2011-03-09 13:26:36

+0

那么这是否意味着如果我只在b和c上查询,索引将不会被使用? – MonkeyBonkey 2012-03-28 04:44:01