• 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})
  • 相关阅读:
    idea修改代码没法实时编译终极解决方案
    linux 安装 hadoop
    linux克隆虚拟机后需要修改的点
    多线程第一篇
    windows搭建ftp环境
    第8章PostGIS参考
    postgis 简单应用
    linux 安装postgresql
    复杂度分析(下)
    复杂度分析(上)
  • 原文地址:https://www.cnblogs.com/wangshouchang/p/6919117.html
Copyright © 2020-2023  润新知