Mongodb索引详解

        1、 查询索引

        选中数据库以后,show  collections ,我们会看到每个库中都有一个名为system.indexes的集合,这里面存储的就是你所选中的库中所有集合的索引 

db.system.indexes.find()
       

        2、 新增一个索引

       新增的方式语句非常简单,比如我有一个名为test的集合,现在我为他增加一个索引

db.test.ensureIndex({'name':1})
       这个索引是为name建的,1或-1 表示索引时升序或降序


       3、 删除一个索引

      删除索引的语句同样简单,怎么建立的,就怎么删除掉


 db.test.dropIndex({'name':1})

      4、 修改索引

      一开始你为name建了一个升序的索引,现在你想把它改为降序的,mongo没有提供修改索引的方法,我们只能删除掉原来的索引,然后在建立新的索引


     5、 后台建立索引

    2中使用的简历索引的方法,是一种阻塞的方法,如果集合中的数据量非常大,那么建立索引的时间就会长一些,在此期间,数据库无法执行其他命令,因为建立索引过程是阻塞的,这里要注意,这个阻塞究竟是整个数据库都阻塞了还是只有当前的这个集合的操作是阻塞的,我目前也拿不准!为了不阻塞其他操作,我们可以在后台执行,语句如下:

db.test.ensureIndex({'name':1},{'backgroup':true})

    

      6、 建立唯一索引

      我前面提到的建立索引的方法,都不是唯一索引,什么是唯一索引呢?就是你建立索引的这个字段不能有重复的值。建立唯一索引的语句如下:

db.test.ensureIndex({'name':1},{'backgroup':true},{'unique':true})
     

      如果我们建立唯一索引时,该字段已经存在了重复的值该怎么办呢?我们可以设置一个dropDups属性

db.test.ensureIndex({'name':1},{'backgroup':true},{'unique':true},{'dropDups':true})


     这样一来,重复的文档将会被删除

     7、 建立复合索引

     在介绍复合索引前,我们先要思考一个问题,那就是索引的意义。如果没有索引,mongo将会全表扫描以便搜索我们要查找的数据,假如集合中有1亿条数据,mongo就必须把这1亿条数据都遍历一遍来查找我们要的数据。显然,这样子的速度会灰常灰常的慢。所以,我们建立索引,那mongo就会去查索引,而不是全表扫描,这样子就快了啊,刚才,我对name建了索引,但是如果查询的条件不只是name,还有别的,比如

db.test.find({'name':'sheng','age':30})
     这时,mongo会先根据name的索引查找符合条件的数据,但是name等于sheng的数据有一千万条,那在查找age等于30的数据时,仍然要扫描这一千万条数据,而这是我们不希望看到的。有人会说,对age也建立索引啊,OK,可以的,既对name建立索引,也对age建立索引,你期望mongo先使用age索引,找出符合name条件的数据,然后再对这些数据根据age索引找出符合age条件的数据,最后万事大吉。但真实的情况不是这样的,真实的情况是,如果你对name,age分别建立的索引,mongo只有用其中的一个,很可能就是age这个索引,因为数值的索引更小,会被优先使用。

     这时,我们可以使用复合索引,就以刚才的情况为例,我们可以这样建立索引

db.test.ensureIndex('name':1,'age':1)
     如此一来,查询时就会按照我们之前期望的那样进行查询了。

     而且呢,如果我们只查询name字段,mongo会使用刚才建立的name和age的复合索引,但如果只查询age字段,却不会使用刚刚建立的复合索引。

     如果你对 A,B,C,D四个字段建立的复合索引,且建索引时A字段在最前面,那么只要查询字段中出现了A字段,就会使用这四个字段的复合索引,反之,就不会使用所建立的复合索引,道理也很简单,建立的复合索引,A的索引部分在最前面,所以,只有查询字段中出现A时,A的索引部分才可能起作用,然后其他字段的索引跟着起作用。网上流传的更广泛的说法是,对于复合索引,只要查询前几个字段时才会起作用,也就是查询A,AB,ABC,ABCD时,复合索引才会被用到,但我实际测试观察发现,只要查询字段中有A就可以了。


     8、 如何知晓查询语句用了什么索引?

     很简单,使用explain就可以了

db.test.find({'name':'sheng'}).explain()

     9、 如何查看索引的大小?

     使用db.stats() 就可以查看数据库的状态,这里面有一个indexsize字段,就是索引的大小,索引是要被转载靳内存中的,所以才会那么快,如果索引很大,以至于内存装不下,就只能载入到硬盘中,但这样一来就会慢了,所以要注意索引的大小,太大了超出了内存的大小,就会导致搜索速度下降。因此,索引不是你想怎么建就怎么建的,得考虑一下内存这个因素,mongodb很吃内存的,那些热点数据也是要被载入内存的,关于内存,你必须有所考量。

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值