mongo索引

原创 2015年07月06日 18:47:18

       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设置的,有兴趣的同学可以自己去看看。在此不作表述。              

用mongo-connector同步生成的EelasticSearch索引如何添加中文分词ik

当搜索引擎ES中的索引建好之后,是不能对其中的已有字段的属性作更改的,要更改,除非删除索引,重新建立。网上也有说用重索引的方法改索引别名,感觉好麻烦没试,有兴趣的朋友可参考(http://blog.c...

mongo索引使用正则表达式注意事项

正则表达式可以灵活地匹配查询条件,如果希望正则表达式能命中索引,就要注意了: Mongodb能为前缀型的正则表达式命中索引,比如:需要查询Mail中user以z开头的: /^z/ 如...

mongo清洗id不唯一的脏数据,并创建唯一索引

mongo清洗id不唯一的脏数据,并创建唯一索引

【Mongo】创建索引

一、【创建索引】 db.COLLECTION_NAME.ensureIndex({KEY:1},{background: true}) *可选参数列表如下: ...
  • EDDYCJY
  • EDDYCJY
  • 2017年07月20日 13:49
  • 204

Mongo DB索引的使用

一、简介           在MongoDB建立索引能提高查询效率,只需要扫描索引只存储的这个集合的一小部分,并只把这小部分加载到内存中,效率大大的提高,如果没有建立索引,在查询时,mo...

mongo 索引查询计划

环境 MongoDB:3.4  robomongo:1.0.RC1 explain 返回的数据 执行的语句: db.urlcontents.find({ir_urltitle:{...

mongo索引小结

官方文档索引部分的地址: http://docs.mongodb.org/manual/indexes/ 以下大部分内容来自官方文档。   1.创建索引 1)创建单个索引...
  • psiitoy
  • psiitoy
  • 2014年12月31日 16:22
  • 344

mongo索引

1.由于 线上 出现卡顿, mongo大量查询,并且 有字段没有加索引导致,还有各种count ,导致大量并发, 2. 让我意识到索引的重要性,特此 写下总结: 之前也是做过mongo压测的, 几十...

mongo shell 之文档 索引

对集合创建索引,能大大提升查询查询效率,尤其是对于mongodb 这种存储大数据的数据库,但是并不是索引建的越多越好,集合建立索引,会增加插入和更新,删除时的性能开销,所以,建立索引一定要合理. mo...

Mongo:笔记四(索引 性能优化)

索引 MongoDB提供了多样性的索引支持,索引信息被保存在system.indexes中,MongoDB中_id字段在创建的时候,默认已经建立了索引,这个索引比较特殊,并且不可删除,不过Cappe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongo索引
举报原因:
原因补充:

(最多只允许输入30个字)