MongoDB 索引

Posted QY_大师兄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB 索引相关的知识,希望对你有一定的参考价值。

   创建索引

        db.users.ensureIndex({‘username‘:1})

        内嵌文档索引

        db.users.ensureIndex({‘addr.City‘:1})

        数组索引

        db.users.ensureIndex({‘subject.data‘:1})

        联合索引

        db.users.ensureIndex({‘age‘:1,‘username‘:1})

        唯一索引(超出8KB大小的键不会受到唯一索引的约束:可以插入多个同样的8KB长的字符串。)

        db.users.ensureIndex({" username" : 1}, {" unique" : true})

        dropDups遇到重复的保留第一条,删除其他

        db.people.ensureIndex({" username" : 1}, {" unique" : true, "dropDups" : true})

        sparse 只对有值的文档进行唯一,null不区分

        db.ensureIndex({" email" : 1}, {" unique" : true, "sparse" : true})

       

        查询中指定使用索引

        hint({" age" : 1, "username" : 1})

       

    选择索引的方向

        一个字段键索引的时候方向无所谓。符合索引需要考虑排序。

    使用覆盖索引

        当一个索引包含用户请求的所有字段,可以认为这个索引覆盖了本次查询。

        在实际中,应该优先使用覆盖索引,而不是去获取实际的文档。这样可以保证工作集比较小。

    隐式索引

        当简历{‘name‘:1,‘age‘:1}索引时,相当于同时创建了{‘name‘:1}的索引。所以不需要再建{‘name‘:1}索引

    低效率的索引

        $where 查询不能使用任何索引

        (‘key‘:{‘$exists‘:true}) 检查该键是否存在 也不能使用索引

    $ne,$not,$nin 效率低,有时会全表扫描

   

    复合索引使MongoDB能够高效地执行拥有多个语句的查询。

    设计基于多个字段的索引时,应该将会用于精确匹配的字段(比如"x":"foo")放在索引的前面,

    将用于范围匹配的字段(比如"y":{"$gt":3,"$lt":5})放在最后。

    这样,查询就可以先使用第一个索引键进行精确匹配,然后再使用第二个索引范围在这个结果集内部进行搜索。

    "$or"可以对每个子句都使用索引,因为"$or"实际上是执行两次查询然后将结果集合并。

    使用"$in"查询时无法控制返回文档的顺序(除非进行排序)。例如,使用{"x":[1,2,3]}与使用{"x":[3,2,1]}得到的文档顺序是相同的。

   

    性能分析 explain()

    "cursor":表示本次查询使用了索引。如果查询要对结果进行逆序遍历,或者是使用了多键索引,就可以在这个字段中看到"reverse"和"multi"这样的值。

    "isMultiKey":用于说明本次查询是否使用了多键索引。

    "n":本次查询返回的文档数量。

    "nscannedObjects":这是MongoDB按照索引指针去磁盘上查找实际文档的次数。如果查询包含的查询条件不是索引的一部分,或者说要求返回不在索引内的字段,MongoDB就必须依次查找每个索引条目指向的文档。

    "nscanned":如果有使用索引,那么这个数字就是查找过的索引条目数量。如果本次查询是一次全表扫描,那么这个数字就表示检查过的文档数量。

    "scanAndOrder":MongoDB是否在内存中对结果集进行了排序。

    "indexOnly":MongoDB是否只使用索引就能完成此次查询。

    "nYields":为了让写入请求能够顺利执行,本次查询暂停的次数。如果有写入请求需要处理,查询会周期性地释放它们的锁,以便写入能够顺利执行。

    "millis":数据库执行本次查询所耗费的毫秒数。这个数字越小,说明查询效率越高。

    "indexBounds":这个字段描述了索引的使用情况,给出了索引的遍历范围。由于查询中的第一个语句是精确匹配。

以上是关于MongoDB 索引的主要内容,如果未能解决你的问题,请参考以下文章

mongodb建立索引&查看索引&删除索引

mongodb 每次都要创建索引吗

[MongoDB]索引

求助mongodb 有索引后查询卡死问题

MongoDB基础

MongoDB的索引操作