mongo索引

       mongo索引和关系型数据库相似。

语法如下:db.people.ensureIndex("username":1)。按照username首字母升序排列。同样的索引只会创建一次,对对某个键的索引只会加速该键的查询,对其他查询可能没有什么帮助。并不是索引越多越好,索引会增加数据库插入非常慢,占用很多空间,并且还可能对查询的速度没啥帮助。

但是没有索引,服务器会“查询怎本书”,做表扫描。当集合很大时,就会很慢。

综上,要合理的创建索引,考虑一下问题:

1.做什么样的查询?那些键需要索引?

2.每个键的索引方向是什么样的?

3.如何应对扩展?有没有不同的键的排列可以使常用数据更多的保留在内存中?


一 为排序创建索引,如果对没有索引的键调用sort,mongodb会将数据提取到内存中来排序。因此,不可能在内存中对数据库做T级别以上的排序。

二 索引名称,默认的索引名称为keyname1_dir1_keyname2_dir2...其中keyname表示索引的键,dir表示方向(1或-1)。也可自定义索引:

db.dbname.ensureIndex({"a":1,"b":1},{"name":"indename"})

三 唯一索引,确保集合每一个文档制定的键都有唯一的值。如保证每个“username”键都有不一样的值

db.dbname.ensureIndex({"username":1},{"unique":true})。但是insert并不检查文档是否插入过了,所以要用安全插入才能在有重复键时,有错误提示信息。

    _id是在创建普通集合时就一同创建的。是不能删除的。如果没有对应的键,索引会将其作为null存储。所以如果对某个键创建唯一索引,但是插入时有不存在时,就会插入null,再次插入就会重复,出错。

四 消除重复,当数据库已经有了重复的值时,创建重复索引就是失败的。

可通过 db.dbname.ensureIndex({"username":1},{"unique":true,"dropDups":true})保留发现的第一个文档,删除剩下的其他文档。

五 复合索引,创建复合唯一索引,单个键的值可以相同,只要所有的键的值组合起来不一样就好。

如:{files_id: ObjectId("xxxxx"),n:1}

       {files_id: ObjectId("xxxxx"),n:2}          ObjectId一样,但是n的值不一样。

六 explain和hint的用法。

explain会返回查询使用的索引情况,耗时,及扫描的文档数的统计信息。

db.dbname.find({"age":18}).sort({"username":1})

输出如下

          

"cursor":"BasicCursor"表示该查询没有用到索引,

"nscanned":64 表示数据库查询了多少文档。该值越接近返回的结果值越好。

"n":64 表示返回的结果值

"millis":0表示数据库查询的时间

         假设现在有一个“age”键的索引,现在查询20到30岁的用户


"cursor":"BtreeCursor age_1"索引存在B树,所以就有个BtreeCursor类型的游标。可以通过名字查询更近一步信息,

db.system.indexes.find({"ns":"test.c","name":"age_1"}),要是索引有相互重叠,查询也很复杂,“allPlans”就会包含所以可能用到的尝试。

如果发现mongodb用了其他非预期索引,可用hint强制使用某个索引。

例如,希望使用{"username":1,"age":1}索引。db.dbname.find({“age”:14,"username":/.*/}).hint({"username":1,"age":1})



最后,索引管理

索引的元信息存储在每个数据库的system.indexes集合中。

                


                  

还有地理空间索引,专为GPS设置的,有兴趣的同学可以自己去看看。在此不作表述。              

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值