zoukankan      html  css  js  c++  java
  • MongoDB 索引篇

    MongoDB 索引篇

    索引的简介

    索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度。且添加索引之后的对文档的删除,修改会比以前速度慢。因为在进行修改的时候会对索引进行更新。
    

    创建一个简单的索引

    db.wsc.ensureIndex({"username":1})
    

    这样在查找的时候速度回变快

    db.wsc.find({usernmae:"jack ma"})
    

    mongodb限制每个集合最多有64个索引。通常,在一个特定的集合上,不应该拥有两个以上的索引。
    .


    **复合索引** 建立了一个复合索引(建立在多个字段上的索引),如果查询条件包括多个键,这个索引就非常有用
    db.users.ensureIndex({'age':1, 'username': 1})
    



    查询方式

    点查询 point query
    用于查询单个值(尽管包含这个值的文档可能有多个)

    db.users.find({'age': 21})
    

    可能21岁的人很多,所以这个查询会有很多的结果的返回。


    多值查询 multi-value-query
    查找多个值相匹配的文档。多值查询也可以理解为多个点查询。

    db.users.find({'age': {"$gte": 21, "$lte": 30}})
    

    ###**索引的类型** ***单键索引*** 就是最普通的的索引
    db.users.ensureIndex({'username': 1})
    

    **唯一索引** 确定集合的每一个文档的指定键都是唯一的值
    db.users.ensureIndex({'username': 1, unique: true})
    

    这样创建了一个值,以后再插入数据的时候,username键的值不能重复,否则会插入不成功


    多键索引
    如果某个键在文档中被标记为数组,那么这个索引就会被标记为多键索引

    > db.members.find()
    { "_id" : ObjectId("1"), "tags" : [  "ame",  "fear",  "big" ] }
    { "_id" : ObjectId("2"), "tags" : [  "ame",  "fear",  "big",  "chi" ] }
    { "_id" : ObjectId("3"), "tags" : [  "ame",  "jr",  "big",  "chi" ] }
    

    当我查找tags='jr'数据时,db会查找所有文档,所以nscanned=3,并且返回一条,此时n=1。

    >db.members.find({tags: 'jr'}).explain()
    {
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 1,
        "nscanned" : 3,
    }
    

    然后建立索引

     db.members.ensureIndex({tags:1})
    

    之后我们在对tags='jr'进行查找,此时nscanned=1,并且isMultiKey由原来的false变为true。所以可以说明,mongodb对数组做了多个键的索引,即把所有的数组元素都做了索引。

    > db.members.find({tags: 'jr'}).explain()
    {
        "cursor" : "BtreeCursor tags_1",
        "isMultiKey" : true,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
    }
    

    **过期索引** 顾名思义就是索引过期之后,相应的数据会被删除。比较适合一些存储一段时间的数据。 *和设置单键索引很类似,只是多个expireAfterSeconds参数,单位是秒。*
    db.collectionName.ensureIndex({key: 1}, {expireAfterSeconds: 10})
    

    例子 下面建立一个索引,然后数据会在30秒后删除

    db.members.ensureIndex({time:1}, {expireAfterSeconds: 30})
    

    被索引键的值必须是ISODate时间类型,例如new Date()类型。如果是非时间类型,则不会自动删除

    稀疏索引
    使用sparse可以创建稀疏索引和唯一索引

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

    创建了稀疏索引的字段,在插入数据的时候无论是否这个字段是否存在都可以插入成功。

    哈希索引

    db.collection.createIndex( { _id: "hashed" } )
    

    地理位置索引

    当文档中有这样的数据时

    	db.places.insert(
    	   {
    	      loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
    	      name: "Central Park",
    	      category : "Parks"
    	   }
    	)
    	
    db.places.insert(
       {
          loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
          name: "La Guardia Airport",
          category : "Airport"
       }
    )
    

    可以创建地理索引

    db.places.createIndex( { loc : "2dsphere" } )
    

    **文本索引 **


    ###索引管理 system.indexes集合中包含了每个索引的详细信息
    db.system.indexes.find()
    

    **1 创建索引** 在**mongo shell**中国有两个方法
    	ensureIndex()
    	createIndex()
    

    例子

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

    2 getIndexes()查看索引

    db.collectionName.getIndexes()
    

    ——————————————————

    db.users.getIndexes()
    [
        {
            "v" : 1,
            "key" : {
                "_id" : 1
            },
            "ns" : "test.users",
            "name" : "_id_"
        },
        {
            "v" : 1,
            "key" : {
                "username" : 1
            },
            "ns" : "test.users",
            "name" : "username_1"
        }
    ]
    

    3.dropIndex删除索引

    > db.users.dropIndex("username_1"){ "nIndexesWas" : 2, "ok" : 1 }
    

     db.users.dropIndex({"username":1})
  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/wangshouchang/p/6919117.html
Copyright © 2011-2022 走看看