Mongodb-索引


  • 註冊用戶

            之前学过关系型数据库的都明白索引的作用是提高查询效率,Mongodb的索引和传统的关系型数据库索引几乎一模一样。可以用书的目录来形容索引,有了索引可以直接锁定目标位置,如果不使用索引就会出现全表扫描的情况,对于大数据来说效率是非常的低。但是也不是越多越好,Mongodb限制每个集合最多可以拥有64个索引,添加每一个索引,每次写操作都将耗费更多的时间,对读访问是很友好的,所以挑选字段显得尤为重要。

             为了对比使用索引和不使用索引的区别,可以做一个小测试,一个集合中储存了公司百万员工的信息,查询某位员工的信息,用explain()函数查看Mongodb的执行查询过程。

    >db.members.find({"memid":"f0000100"}).explain()
    {
        "cursor": "BasicCursor",
        "nscanned": 1000000,
        "nscannedObjects":1000000,
        "n": 1,
        "millis": 760,
        "nYields": 0,
        "nChunkSkips": 0,
        "isMultiKey": false,
        "indexOnly": false,
        "indexBounds":{
         }
    }
    

    从数据可以看出nscanned为扫描数量,此次扫描为全部文档都扫描一遍,时间 millis 760

    如果在memid字段上创建一个索引

    >db.members.ensureIndex({"memid":1})
    

    再次执行查询操作

    >db.members.find({"memid":"f0000100"}).explain()
    {
        "cursor": "BtreeCursor memid_1",
        "nscanned": 1,
        "nscannedObjects":1,
        "n": 1,
        "millis": 5,
        "nYields": 0,
        "nChunkSkips": 0,
        "isMultiKey": false,
        "indexOnly": false,
        "indexBounds":{
               "memid": [
        [
            "memidf0000100",
            "memidf0000100"
        ]
                ]
         }
    }
    

    对比 nscanned与millis,明显发现 只有一次扫描,时间也缩短很多,由此可以看出使用索引的优势,接下来我们就来谈谈如何创建各种索引以及删除索引。

    1.创建简单索引

    >db.collection.ensureIndex({"key":1})
    

    需要提一下的是1与-1,1为升序,-1为降序

    2.创建复合索引 前面有讲过多个索引,每次写操作都将耗费更多的时间,如果要对多个字段索引,可以考虑使用复合索引。

    >db.collection.ensureIndext({"key1": 1,"key2": 1})
    

    顺序为先按照第一个字段排序,第一个字段相同再按照第二个字段排序

    3.创建唯一键索引 有些时候我们要确保插入的键值唯一,同时为了提高查询效率需要对其创建索引,此时我们就需要创建唯一键索引,格式如下:

    >db.collection.ensureIndex({"key": 1},{"unique":true})
    

    有一种特殊情况,如果插入的文档缺少唯一键的字段,mongodb会将此字段默认为null存储文档,但是只能操作一次,如果第二次插入缺少唯一键的文档,则无法成功插入。

    唯一键索引对于复合索引也同样适用,需要注意的是单个键的值可以相同,但是组合值必须是唯一的。

    4.创建去重索引 在创建唯一键索引时如果已经存在重复键值无法创建时,可以考虑使用dropdups自动去重,格式如下:

    >db.collection.ensureIndex({"": 1},{"unique": true,"dropDups": true})
    

    使用此索引会保留第一个文档,其他重复文档将被删除 数据库操作中特别要注意任何有删除动作的操作 5.删除索引 当业务发生变化时,有些索引已不再满足要求,此时可以使用dropIndex删除这些索引,格式如下:

    >db.collection.dropIndex("x_1_y_1")
    

登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待