关闭

mongo索引

标签: mongodb索引
423人阅读 评论(0) 收藏 举报
分类:

       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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4282次
    • 积分:172
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:4篇
    • 译文:1篇
    • 评论:0条
    文章分类