MongoDB理解复合索引

时间:2016-05-10 20:51:22

标签: mongodb indexing

我的收藏中有6个索引字段。我的应用程序使用具有不同组合的聚合查询。以下是一些可能的例子:

1. {$match: {$and: [{field1: {$in: [1,2,3]}}, {$field5: {$gt: 8}}]}}
2. {$match: {$and: [{field2: {$nin: [4,5,6]}}, {$field5: {$lte: 8}}, {$field6: 5}]}}
3. {$match: {field1: {$in: [7,8,9]}}}

正如我之前所说,所有字段都已编入索引。在cource中,当我执行第一个查询时, explain()函数告诉我,只使用了一个索引。查询中的字段数取决于用户的选择。

我应该为每个字段组合创建索引(我的意思是 {field1:1,field2:1},{field1:1,field2:1,field3:1} 等)或者我可以为所有字段创建一个复合索引,如 {field1:1,field2:1,field3:1,field4:1,field5:1,field6:1}

我认为第一个决定可能有点奇怪,因为6个领域有很多组合。

2 个答案:

答案 0 :(得分:0)

如果查询中有6个字段中的任何一个,您可以更改单词,而不是让单个字段创建键/值对数组。

{values: [n:"field1", v: "meerkat", n:"field2", value:"mongoose"] }

现在,您可以定义涵盖所有字段的单个复合索引。

{"values.n": 1, "values.v": 1}

您的查询将如下所示:

{ "values": { "$elemMatch" : { v:"field1", v:"meerkat" } }

答案 1 :(得分:0)

您的第二种方式可行,但更改排序顺序。

有两点需要注意:

  
      
  1. 索引包含查询扫描的所有字段时,索引支持查询。查询扫描索引而不是集合。创建支持查询的索引可以大大提高查询性能。

  2.   
  3. 如果您有时仅查询一个密钥,并且在其他时间查询该密钥并结合第二个密钥,则创建复合索引比创建单个密钥索引更有效。 MongoDB将对两个查询使用复合索引。多个字段上的单个复合索引可以支持搜索这些字段的“前缀”子集的所有查询。

  4.   

示例:

  

集合上的以下索引:

     

{x:1,y:1,z:1}   可以支持以下索引支持的查询:

     

{x:1}   {x:1,y:1}   在某些情况下,前缀索引可能提供更好的查询性能:例如,如果z是一个大型数组。

     

{x:1,y:1,z:1}索引也可以支持许多与以下索引相同的查询:

     

{x:1,z:1}   此外,{x:1,z:1}还有一个用途。鉴于以下查询:

     

db.collection.find({x:5})。sort({z:1})   {x:1,z:1}索引支持查询和排序操作,而{x:1,y:1,z:1}索引仅支持查询。有关排序的更多信息,请参阅Use Indexes to Sort Query Results

对多个字段进行排序的基本示例:

  

您可以对索引的所有键或子集指定排序;但是,排序键必须按它们在索引中显示的顺序列出。例如,索引键模式{a:1,b:1}可以支持{a:1,b:1}上的排序,但不能支持{b:1,a:1}上的排序。

     

对于使用复合索引进行排序的查询,cursor.sort()文档中所有键的指定排序方向必须与索引键模式匹配,或者与索引键模式的反转匹配。例如,索引键模式{a:1,b:-1}可以支持对{a:1,b:-1}和{a:-1,b:1}的排序,但不支持{a: - 的排序1,b:-1}或{a:1,b:1} Read this