MongoDB:索引顺序和查询顺序必须匹配吗?

MongoDB:索引顺序和查询顺序必须匹配吗?,mongodb,Mongodb,这个问题涉及管理索引和插入Bson文档的内部方法 当您创建多个索引(如“index1”、“index2”、“index3”)时,将存储索引以供查询期间使用,但查询顺序和结果性能如何 样本 index1,index2,index3-->按相同顺序查询index1,index2,index3(最佳情况) index1,index2,index3-->按另一顺序查询index2,index1,index3(顺序已更改) 很多时候,您使用嵌套查询,包括这3个索引和其他项或多个索引。查询的顺序会导致一些时

这个问题涉及管理索引和插入Bson文档的内部方法

当您创建多个索引(如“index1”、“index2”、“index3”)时,将存储索引以供查询期间使用,但查询顺序和结果性能如何

样本
index1,index2,index3-->按相同顺序查询index1,index2,index3(最佳情况) index1,index2,index3-->按另一顺序查询index2,index1,index3(顺序已更改)

很多时候,您使用嵌套查询,包括这3个索引和其他项或多个索引。查询的顺序会导致一些时间损失?。传递有关定义的索引顺序或内部体系结构的查询时,必须注意此顺序搜索吗?我想知道我是否真的关心这件事,或者我是否可以更自由地提出我的问题

谢谢。

发件人:

如果你有一个复合索引 多个字段,您可以使用它来 查询的起始子集 领域。所以如果你有一个索引

a、 b,c

您可以在查询中使用它

a

a、 b

a、 b,c


是的,秩序很重要。如果您需要更精确的答案,您应该稍微澄清一下您的问题。

查询中条件的顺序不会影响它是否可以使用索引或否

e、 g。 典型的文档结构:

{
    "FieldA" : "A",
    "FieldB" : "B"
}
如果在A和B上有复合索引:

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1})
然后,以下两个查询都将能够使用该索引:

db.MyCollection.find({FieldA : "A", FieldB : "B"})
db.MyCollection.find({FieldB : "B", FieldA : "A"})
因此,查询中条件的顺序不会阻止索引的使用——我认为这是您要问的问题

您可以通过在shell中尝试两个查询并在查找后添加
.explain()
来轻松测试这一点。我这样做只是为了确认,他们都表明使用了复合索引

但是,如果运行以下查询,则不会使用索引,因为未对FieldA进行查询:

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

因此,是索引中字段的顺序决定了它是否可以被查询使用,而不是查询本身中字段的顺序(这就是Lucas所指的)。

我将删除
mongodb csharp
标记:这是一个关于后端索引的问题。b、a或b、c、a或c、b、a怎么办。你说你可以查询,但也就是说,我唯一要求的是将呈现给索引器的查询顺序。var Query=Query.AND(Query.EQ(“B”,B),Query.EQ(“A”,A)),Query=Query.Or(Query,Query.EQ(“C”,C))。内部将不理解A、B、C或将丢失B、A、C。通过此注释,并假设索引(A、B、C),我假设您正在询问查询优化人员是否能够重新排列(B、C、A)到(A、B、C)上的示例查询以使用索引。答案是肯定的,使用
explain
(正如@AdaTheDev所指出的)可以很容易地证实这一点。注意:至少在1.8.0rc1上是这样的-没有在以前的版本上测试过。那么这是否意味着如果我只在b和c上查询,将不会使用索引?从我上面引用的页面中可以看出:“如果查询中不存在第一个键,则只有在明确提示的情况下才会使用索引。”(适用于MongoDB 1.6+)。因此,只有在查询中使用提示时才会使用它,但不确定是否要这样做,这取决于您的数据集。这里需要注意的重要一点是,查询中的顺序并不重要,但索引中定义的字段的顺序却很重要。但是,在定义索引时,如何指定顺序?ensureIndex将JS对象作为参数,并且JS对象字段没有顺序。(嗨,斯科特!)@Leopd:它们不是按照规范排序的,但它们“碰巧”是在实现中排序的,MongoDB依赖于这种行为。这是MongoDB中最令人不快的设计缺陷之一,并导致大多数其他语言中的跳跃(因为大多数字典类型都没有排序)here@Cmag-澄清一下,因为听起来你对这个答案投了反对票,因此误解了我的意思。索引中字段的顺序很重要-我们同意,这是根据我的答案(我答案中的最后一句话)。但是,根据我的示例,给定一个复合索引,查询中条件的顺序并不重要