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

  • 相关阅读:
    家用游戏机简史
    九:二叉搜索树与双向链表(二叉搜索树转为有序双向链表)
    诺心(LECAKE) | 氪加
    微博书 | 氪加
    王利芬对话蒲易 ——花店如何成为高端电商?_北京_歇会儿网
    王利芬对话蒲易 ——花店如何成为高端电商?_线下活动报名_优米网
    团队介绍 | 魅动 Magic Motion
    魅动成人用品情趣跳蛋女用自慰器具 魅惑紫【图片 价格 品牌 报价】-京东商城
    最新创业好项目 | 投资项目推荐 | 数据库 | 氪加 特效
    Fancy
  • 原文地址:https://www.cnblogs.com/qy-brother/p/7001069.html
Copyright © 2020-2023  润新知