zoukankan      html  css  js  c++  java
  • 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":这个字段描述了索引的使用情况,给出了索引的遍历范围。由于查询中的第一个语句是精确匹配。

  • 相关阅读:
    javascript的闭包的形成
    MongoDB 基础
    VirtualBox的四种网络连接方式
    jquery插件Asgrid开发小记
    jQuery插件开发指南[转]
    javascript对Dom操作中table添加行性能问题
    【对.NET系统架构改造的一点经验和教训】的技术要点的看法
    杭电1205
    杭电1248
    杭电2059
  • 原文地址:https://www.cnblogs.com/qy-brother/p/7001069.html
Copyright © 2011-2022 走看看