MongoDB组合索引

1、组合索引的概念

组合索引就是一个索引结构里面包括一个集合文档的多个字段,如{‘a’:1,‘b’:-1},该类索引的创建的主要目的就是提升数据库的查询速度。

2、创建人生第一个组合索引

创建组合索引的语法格式如下:db.collection.createIndex({‘field’:1,‘field’:-1}) 按照格式即可创建组合索引。
后台进行索引创建:因为索引创建对于mongo来说开销是非常大的,当数据库量大时尤为明显,索引在索引创建过程中多提倡后台创建,语法如下:db.collection.createIndex({‘field’:1,‘field’:-1},{‘background’:true})
指定索引名称:索引创建默认的名称为key_num(key为字段名,num为1或-1)通过_进行连接,如{‘age’:1,‘in_school_time’:-1}的默认索引名称为:age_1_in_school_time_-1,当创建的索引量大时,就显得太乱了。具体创建语法-------db.collection.createIndex({‘field’:1,‘field’:-1},{‘name’:‘index’})
例:有如下格式的文档:{‘name’:‘xiaoming’,‘age’:18,‘in_school_time’:1561910400} 按上面的合适创建入校时间in_school_time倒序,年龄正序的组合索引-----db.collection.createIndex({‘age’:1,‘in_school_time’:-1})

3、组合索引创建之sort升序,降序问题

索引的参考字段要么是升序的要么是降序的排序顺序。对于单字段索引,字段的排序顺序是无关紧要的,因为MongoDB可以在两个方向上来回切换。然后对于组合索引,排序顺序决定了索引支持的排序操作。
上面这句话我们可以理解成,排序索引,mongo可以在两个方向上来回切换,要么同为索引创建时的{‘a’:1,‘b’:-1},要么就切换成其对立面{‘a’:-1,‘b’:1},对于上面提及的组合索引,排序顺序决定了索引支持的排序操作可以看下面的例子,详细说就是:我现在要做的排序规则是年龄倒序,入校时间正序,而你创建一个如下的索引-----{‘age’:1,‘in_school_time’:1},就算mongo做方向上的切换也只能是{‘age’:-1,‘in_school_time’:-1},同样不能支持我的查询语句。
注:mongo做索引方向上的切换只能同时进行,不能此时a进行正序,b进行倒序。只能说是共进退
假如有如下文档{‘name’:‘xiaoming’,‘age’:18,‘in_school_time’:1561910400},现在对该文档进行sort排序操作:

db.collection.find().sort({‘age’:1,‘in_school_time’:-1}), 年龄正序,入校时间倒序
db.collection.find().sort({‘age’:-1,‘in_school_time’:1}),年龄倒序,入校时间正序
针对上面的查询语句我们可以通过创建如下索引轻松搞定:db.collection.createIndex({‘age’:1,‘in_school_time’:-1})或db.collection.createIndex({‘age’:-1,‘in_school_time’:1}),但是如果针对下面的查询上面的索引还有效吗?

db.collection.find().sort({‘age’:1,‘in_school_time’:1})
db.collection.find().sort({‘age’:-1,‘in_school_time’:-1})
通过查询时间比较发现,作如上排序时db.collection.createIndex({‘age’:1,‘in_school_time’:-1})创建的索引不在起效,原因就在于对于组合索引,排序顺序决定了索引支持的排序操作。想要提升查询速度可以通过创建如下索引:db.collection.createIndex({‘age’:1,‘in_school_time’:1})或db.collection.createIndex({‘age’:-1,‘in_school_time’:-1})

4、组合索引前缀 问题

索引前缀是指索引字段最前面的子集,例如下面的组合索引-----{‘age’:1,‘in_school_time’:1,‘name’:1},它的索引前缀有:{‘age’:1,‘in_school_time’:1}。
值得注意的是mongoDB对索引前缀的查询也是可以利用相关的组合索引进行查询,针对上面的组合索引我们在进行如下字段:(age),(age,in_school_time),(age,in_school_time,name)的查询时就能利用上面的组合索引。
说到这里就要说一个索引创建浪费的现象:针对上面的例子,假如我们同时创建了{‘age’:1,‘in_school_time’:1,‘name’:1},{‘age’:1}两个索引,那么后者就显得很多余,因为在进行age字段查询的时候完全就可以通过组合索引进行查询。
mongo每张表最大支持64个索引,索引不科学的创立索引完全是不可取的。

5、指定索引查询

例如有如下索引{‘age’:1,‘in_school_time’:-1},名字为index,我们在进行相关查询时就可以通过指定索引进行查询。
db.collection.find().hint({‘age’:1,‘in_school_time’:-1})或者db.collection.find().hint(‘index’),以此提升查询速度。
当然也可以不使用索引进行全表扫描,db.collection.find().hint({"$natural":1}),当然如果数据量大得情况下这样会造成数据库阻塞很长时间,并且这段时间内你什么都做不了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值