MongoDB组合索引

MongoDB支持组合索引,就是一个索引结构里面包括一个集合文档的多个字段。下图展示了一个拥有两个字段的组合索引:

组合索引的字段不能超过31个

组合索引查询的时候支持多个字段的匹配

 

一、创建一个组合索引

创建组合索引的语法格式如下:

db.collection.createIndex({field1:type,field2:type2,***})

跟在字段后面的索引声明描述了该字段的索引类型,比如值为1描述了该索引是一个升序索引,值为-1表示该索引是降序索引

 

重要:不能创建hash类型的组合索引。如果你创建hash类型的组合索引就会报报错

 

假设有个products的集合,集合存在如下的文档:

{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }

 

下面的操作会在item和stock上面创建升序索引:

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

 

组合索引中字段出现的先后顺序非常重要。该索引首先对文档的item进行排序,然后再根据每个item对stock字段进行排序

 

除了支持对组合索引的所有字段的查询的完全匹配,组合索引也支持对索引字段的前缀匹配,这意味着索引不仅仅支持item和stock字段的索引查询,也支持item字段的查询

 

二、排序顺序

索引的参考字段要么是升序的要么是降序的排序顺序。对于单字段索引,字段的排序顺序是无关紧要的,因为MongoDB可以在两个方向上来回切换。然后对于组合索引,排序顺序决定了索引支持的排序操作。

 

假设一个集合events包含的文档里面有username和date字段,应用的查询结果首先需要根据username升序排序再根据date降序排序:

db.events.find().sort({username:1,date:-1})

或者查询的结果首先需要根据username降序排序再根据date升序排序:

db.events.find().sort({username:-1,date:1})

下面的索引支持上面两种排序操作:

db.events.createIndex({"username":1,"date":-1})

然而,上面的索引不支持根据username升序排列再根据date升序排列:

db.events.find().sort({username:-1,date:-1})

 

三、前缀

索引前缀是指索引字段最前面的子集,例如下面的组合索引:

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

 

它有下来的索引前缀:

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

 

对于组合索引,MongoDB对索引前缀的查询也能使用索引。既然如此,MongoDB可以再下面字段的查询中使用索引:

  • item
  • item 和 location
  • item、location和stock

MongoDB也能使用索引支持在item和stock上面的查询,因为item字段符合索引前缀,但是对于在item和stock上面的查询则没法使用索引

 

然而,MongoDB不能在没有item字段的查询中使用索引,因为查询字段中没有匹配索引前缀:

  • location
  • stock
  • location 和 stock

 

如果你的集合既有组合索引又有一个索引在其前缀上,比如{a:1,b:1}和{a:1},如果这个索引既不是稀疏索引也不是唯一索引,那么你就可以删除那个前缀上的索引({a:1}).MongoDB将会使用组合索引来匹配前缀索引

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值