MongoDB:第二个索引没用吗?

时间:2017-01-16 04:27:36

标签: mongodb indexing

在MongoDb中,我有一个索引{a:1,b:1}。 创建另一个索引{a:1}是否无用,因为它已被另一个索引覆盖了?

我的查询遵循以下模式:findOne({a:"...",b:"..."})find({a:"..."})

2 个答案:

答案 0 :(得分:1)

查看MongoDB文档Create a compound index

以下操作会在料品和库存字段中创建升序索引:

db.products.createIndex( { "item": 1, "stock": 1 } )
  

除了支持所有索引字段匹配的查询外,   复合索引可以支持与前缀匹配的查询   索引字段。 也就是说,索引支持item字段上的查询   以及itemstock字段:

db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )

对于复合索引,MongoDB可以使用索引来支持对索引前缀的查​​询。

顺便说一下,如果你创建一个复合索引:

{ "item": 1, "location": 1, "stock": 1 }

MongoDB可以在以下字段中使用索引进行查询:

  • 项目字段
  • 项目字段和位置字段
  • 项目字段,位置字段和库存字段。

但它在itemstock上效率不高。

希望这有帮助。

答案 1 :(得分:1)

由于prefixes,我认为您不需要创建另一个索引{a:1}

  

索引前缀是索引字段的起始子集。例如,请考虑以下复合索引:

{ "item": 1, "location": 1, "stock": 1 }
     

索引具有以下索引前缀:

{ item: 1 }
{ item: 1, location: 1 }
     

对于复合索引,MongoDB可以使用索引来支持对索引前缀的查​​询。因此,MongoDB可以使用索引对以下字段进行查询:      

      
  • item字段
  •   
  • item字段和location字段
  •   
  • item字段和location字段以及stock字段。
  •   

创建复合索引更有效 [1] MongoDB可以使用整个索引或索引前缀 [2] 的交集。