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

use*_*558 24 mongodb

这个问题涉及管理索引和编写Bson文档的内部方法.

当您创建多个索引(如"index1","index2","index3"...)时,将存储索引以在查询期间使用,但查询顺序和结果如何.

示例
index1,index2,index3 ---->查询顺序相同index1,index2,index3(最佳情况)index1,index2,index3 ---->查询另一个顺序index2,index1,index3(修改顺序)

很多时候您使用嵌套查询,包括这3个索引和其他项或更多索引.查询的顺序会导致一些时间丢失?必须传递关于定义的索引顺序的查询或内部架构是否关注此订单搜索?我想知道我是否注意到这一点,或者可以自由地提出自己的疑问.

谢谢.

Ada*_*Dev 41

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

例如典型的文件结构:

{
    "FieldA" : "A",
    "FieldB" : "B"
}
Run Code Online (Sandbox Code Playgroud)

如果A和B上有复合索引:

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1})
Run Code Online (Sandbox Code Playgroud)

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

db.MyCollection.find({FieldA : "A", FieldB : "B"})
db.MyCollection.find({FieldB : "B", FieldA : "A"})
Run Code Online (Sandbox Code Playgroud)

因此,查询中条件的排序不会阻止使用索引 - 我认为这是您要问的问题.

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

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

db.MyCollection.find({FieldB : "B"})
Run Code Online (Sandbox Code Playgroud)

因此,它是索引中字段的顺序,用于定义查询是否可以使用它,而不是查询本身中字段的顺序(这是Lucas所指的).

  • 这里需要注意的重要一点是查询中的顺序无关紧要,但索引中定义的字段的顺序确实如此. (6认同)
  • @Leopd:它们不按规范排序,但它们"碰巧"在实现中被排序,而MongoDB依赖于这种行为.这是MongoDB中比较令人不快的设计瑕疵之一,并导致大多数其他语言的箍跳(因为大多数字典类型都没有*排序). (4认同)
  • @Cmag-澄清一下,好像您对这个答案不满意,因此误解了我的意思。索引中的字段顺序确实很重要-我们同意,这是我的回答(我的回答中的最后一句话)。但是,根据我的示例,给定一个复合索引,查询中条件的顺序*并不重要* (2认同)

Luc*_*lis 11

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

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

A,B,C

你可以使用它查询

一个

A,B

A,B,C

所以是的,订单很重要.如果您需要更精确的答案,您应该稍微澄清一下您的问题.