MongoDB:索引,排序

时间:2016-11-02 14:06:32

标签: mongodb

在阅读了关于索引,排序,交集的官方文档之后,我对一切如何协同工作有点困惑。

我在查询中使用我创建的索引时遇到了麻烦。我在一个拥有大约400万份文档的集合上使用mongodb 3.0.3。

为了简化,假设我的文档由6个字段组成:

{
  a:<text>,
  b:<boolean>,
  c:<text>,
  d:<boolean>,
  e:<date>,
  f:<date>
}

我想要实现的查询如下:

db.mycoll.find({ a:"OK", b:true, c:"ProviderA", d:true, e:{ $gte:ISODate("2016-10-28T12:00:01Z"),$lt:ISODate("2016-10-28T12:00:02") } }).sort({f:1});

如此直观地我创建了两个索引

db.mycoll.createIndex({a: 1, b: 1, c: 1, d:1, e:1  }, {background: true,name: "test1"})
db.mycoll.createIndex({f:1}, {background: true,name: "test2"})

但是explain()告诉我第一个索引根本就没用过。 我知道当过滤器中有游戏范围(在e场中)时存在某种限制,但我无法找到它的方法。

此外,我没有在f上使用单个索引,而是在{e:1,f:1}上尝试复合索引,但它没有改变任何内容。

那么我误解了什么? 感谢您的支持。

更新:我也找到了mongodb 2.6的以下谓词:

  

使用sort查询的一个好的经验法则是按以下顺序对索引字段进行排序:

     
      
  • 首先,您将在其中查询确切的值。

  •   
  • 其次,您要对其进行排序的字段。

  •   
  • 最后,您将在其中查询一系列值的字段(例如$ gt,$ lt,$ in)

  •   

使用此经验法则的一个示例位于下面的“对一系列值进行复杂查询的结果排序”部分,包括进一步阅读的链接。

这是否也适用于3.X版本?

更新2:跟随上述谓词,我创建了以下索引

db.mycoll.createIndex({a: 1, b: 1, c: 1, d:1 , f:1, e:1}, {background: true,name: "test1"})

对于同样的问题:

db.mycoll.find({ a:"OK", b:true, c:"ProviderA", d:true, e:{ $gte:ISODate("2016-10-28T12:00:01Z"),$lt:ISODate("2016-10-28T12:00:02") } }).sort({f:1});

确实使用了索引。但是,过多的键似乎是扫描,我可能需要找到更好的顺序查询/索引中的字段。

2 个答案:

答案 0 :(得分:1)

对于索引选择,Mongo行为有时有点奇怪。

Mongo自动决定使用哪个索引。索引越小越有可能使用它(特别是只有一个字段的索引) - 这是我的经验。可能会发生这种情况,因为它经常被加载到RAM中?查找Mongo在空闲时执行测试查询时要使用的索引。但结果有时会出乎意料。

因此,如果您知道要使用的索引,则可以使用$hint选项强制查询使用特定索引。你应该试试。

答案 1 :(得分:1)

查询中使用的两个索引和排序不重叠,因此MongoDB can not use them for index intersection

  当sort()操作要求索引与查询谓词完全分离时,

索引交集不适用。