MongoDB索引

一、索引基础:
    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。下面是创建索引的命令:
      > db.test.ensureIndex({"username":1})
    可以通过下面的名称查看索引是否已经成功建立:
     > db.test.getIndexes()
    删除索引的命令是:
     > db.test.dropIndex({"username":1})
    在MongoDB中,我们同样可以创建复合索引,如:
     -- 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。
      > db.test.ensureIndex({"username":1, "age":-1})
     该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,但是只是基于age的查询将不 会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺 序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用 。如:
    > db.test.find({"age": 30, "username": "stephen"})
    对于上面示例中的查询条件,MongoDB在检索之前将会动态的调整查询条件文档的顺序,以使该查询可以用到刚刚创建的复合索引。
    我们可以为内嵌文档创建索引,其规则和普通文档没有任何差别,如:
    > db.test.ensureIndex({"comments.date":1})
    对于上面创建的索引,MongoDB都会根据索引的keyname和索引方向为新创建的索引自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:
    > db.test.ensureIndex({"username":1},{"name":"testindex"})    
    随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用sort,MongoDB需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以致无法在内存中进行排序,此时MongoDB将会报错。
    > db.system.indexes.find() 返回当前数据库中的所有索引

二、唯一索引:
    在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
    >   db.test.ensureIndex({"userid":1},{"unique":true}) 
    >   db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})   创建唯一索引的同时,删除重复记录
    >   db.test.ensureIndex({"userid":1,"age":1},{"unique":true})    复合唯一索引

三、索引最佳实践:
    >  db.test.totalIndexSize();   查询某个collection的索引大小

    > db.test.find().explain();      查询计划
理解explain

explain输出主要有三个字段:

    • cursor: 游标不是 BasicCursor就是 BtreeCursor. 第二种意味着使用了索引。
    • nscanned: 扫描document的行数。
    • n: 查询返回的行数。你希望n的值和nsanned值接近。要避免做collection的扫描,也就是访问所有的document。
    • millis: 查询完成的毫秒数。这个对于比较索引和非索引性能非常有用。
四、创建索引的一些参数
      
     MongoDB索引创建选项
sparse:是否是稀疏索引,稀疏索引只索引存在指定field的记录,不存在此field的记录不索引
unique:  创建唯一索引
// in this variation, it's ok to not have an email address,
// but if you have one, it must be unique:
db.things.ensureIndex({email:1},{unique:true,sparse:true});
dropDups: 创建索引时删除重复索引key,应该和unique一起使用
background: 使用后台方式创建索引,默认是前台方式,前台方式会

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值