`

mongodb索引

阅读更多

一、索引基础:
    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。下面是创建索引的命令:
    > db.test.ensureIndex({"username":1})
    可以通过下面的名称查看索引是否已经成功建立:
    > db.test.getIndexes()
    删除索引的命令是:
    > db.test.dropIndex({"username":1})
    在MongoDB中,我们同样可以创建复合索引,如:
    -- 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。
    > db.test.ensureIndex({"username":1, "age":-1})
    该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,但是只是基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。如:
    > db.test.find({"age": 30, "username": "stephen"})
    对于上面示例中的查询条件,MongoDB在检索之前将会动态的调整查询条件文档的顺序,以使该查询可以用到刚刚创建的复合索引。
    我们可以为内嵌文档创建索引,其规则和普通文档没有任何差别,如:
    > db.test.ensureIndex({"comments.date":1})
    对于上面创建的索引,MongoDB都会根据索引的keyname和索引方向为新创建的索引自动分配一个索引名,下面的命令可以在创建索引时为其指定索引名,如:
    > db.test.ensureIndex({"username":1},{"name":"testindex"})    
    随着集合的增长,需要针对查询中大量的排序做索引。如果没有对索引的键调用sort,MongoDB需要将所有数据提取到内存并排序。因此在做无索引排序时,如果数据量过大以致无法在内存中进行排序,此时MongoDB将会报错。
    
二、唯一索引:
    在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
    > db.test.ensureIndex({"userid":1},{"unique":true})
    如果再次插入userid重复的文档时,MongoDB将报错,以提示插入重复键,如:
    > db.test.insert({"userid":5})
    > db.test.insert({"userid":5})
    E11000 duplicate key error index: test.test.$userid_1  dup key: { : 5.0 }    
    如果插入的文档中不包含userid键,那么该文档中该键的值为null,如果多次插入类似的文档,MongoDB将会报出同样的错误,如:
    > db.test.insert({"userid1":5})
    > db.test.insert({"userid1":5})
    E11000 duplicate key error index: test.test.$userid_1  dup key: { : null }        
    如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯一索引时消除重复文档,仅保留发现的第一个文档,如:
    --先删除刚刚创建的唯一索引。
    > db.test.dropIndex({"userid":1}) 
    --插入测试数据,以保证集合中有重复键存在。
    > db.test.remove()
    > db.test.insert({"userid":5})
    > db.test.insert({"userid":5})    
    --创建唯一索引,并消除重复数据。
    > db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})    
    --查询结果确认,重复的键确实在创建索引时已经被删除。
    > db.test.find()
    { "_id" : ObjectId("4fe823c180144abd15acd52e"), "userid" : 5 }    
    
    我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
    > db.test.ensureIndex({"userid":1,"age":1},{"unique":true})    
    
三、使用explain:
    explain是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用该方法,就可以得到查询细节。explain会返回一个文档,而不是游标本身。如:
    > db.test.find().explain()
    {
        "cursor" : "BasicCursor",
        "nscanned" : 1,
        "nscannedObjects" : 1,
        "n" : 1,
        "millis" : 0,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {

        }    
    }
    explain会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
    "cursor":"BasicCursor"表示没有使用索引。
    "nscanned":1 表示查询了多少个文档。
    "n":1 表示返回的文档数量。
    "millis":0 表示整个查询的耗时。
    
四、索引管理:
    system.indexes集合中包含了每个索引的详细信息,因此可以通过下面的命令查询已经存在的索引,如:
    > db.system.indexes.find()
    如果在为已有数据的文档创建索引时,可以执行下面的命令,以使MongoDB在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整个创建过程效率更高,但是在创建时MongoDB将无法接收其他的操作。
    > db.test.ensureIndex({"username":1},{"background":true})

分享到:
评论

相关推荐

    MongoDB索引管理与高级索引.pdf

    MongoDB索引管理与高级索引.pdf 学习资料 复习资料 教学资源

    MongoDB索引优化与管理-刘诚杰 天痕

    MongoDB索引优化与管理-刘诚杰 天痕,介绍 1. 索引概念 2. 索引优化 3. 执行计划 4. 索引管理

    MongoDB索引限制.pdf

    MongoDB索引限制.pdf 学习资料 复习资料 教学资源

    MongoDB索引管理.pdf

    MongoDB索引管理.pdf 学习资料 复习资料 教学资源

    Mongodb索引的优化

    MongoDB索引几乎和关系型数据库的索引一样.MongoDB的查询优化器能够使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序.准确来说,这些索引是通过B-Tree索引来实现的。在命令行中,可以...

    MongoDB索引与查询.pdf

    MongoDB索引与查询.pdf 学习资料 复习资料 教学资源

    MongoDB索引的创建docx.pdf

    MongoDB索引的创建docx.pdf 学习资料 复习资料 教学资源

    SpringBoot MongoDB 索引冲突分析及解决方法

    主要介绍了SpringBoot MongoDB 索引冲突分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    MongoDB数据库索引介绍.pptx

    MongoDB数据库索引介绍.pptx

    MongoDB索引使用详解

    索引就像书的目录,如果查找某内容在没有目录的帮助下,只能全篇查找翻阅,这导致效率非常的低下;如果在借助目录情况下,就能很快的定位具体内容所在区域,效率会直线提高。 索引简介 首先打开命令行,输入mongo。...

    MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上创建索引。下面分别讲解...

    MONGODB的索引探究

    MONGO的索引跟MYSQL、ORACLE基本上差不多,实现了其中的一部分,当然了,肯定是没有它们功能齐全的,因为MONGO本质上也是基于磁盘文件的,所以如果索引的话,效率是不敢想像的!

    关于MongoDB索引管理-索引的创建、查看、删除操作详解

    本文讲述了关于MongoDB索引管理包括索引的创建、查看索引、删除索引各方面的命令及使用方法

    课时11:MongoDB索引原理及使用.mp4

    MongoDB数据库

    iiizk#JavaNotes#4、MongoDB索引1

    1. 普通索引 1. 单列索引 2. 多列索引 3. 子文档索引 2. 唯一索引 3. 稀疏索引 4. 哈希索引 5. 重建索引 6. 删除索引 7. 查看索引

    MongoDB 索引 和explain分析查询速度1

    一、索引基础1 二、唯一索引2 三、索引的一些参数3 一、索引基础 二、唯一索引 三、索引的一些参数 四、使用 explain 五、explain execut

    index-model:MongoDB索引模型

    mongodb-index-model 适用于人类的MongoDB索引工具包。例子var IndexModel = require ( 'mongodb-index-model' ) ;// e.g. from collection.getIndexes()var indexDefs = [ { 'v' : 1 , 'key' : { '_id' : 1 } , '...

    MongoDB索引实战技巧

    主要描述了MongoDB索引相关的一些基础知识和使用技巧。 虽然MongoDB的索引在存储结构上都是一样的,但是根据不同的应用层需求,还是分成了唯一索引(unique)、稀疏索引(sparse)、多值索引(multikey)等几种类型...

    深入解析MongoDB聚合与索引:提升数据库效能的关键策略

    同时,深入探讨MongoDB索引的类型(如单键索引、复合索引、多键索引等),并分析索引的创建、管理和优化策略。此外,文章还介绍了索引对查询性能的影响,包括如何通过explain()方法分析查询和索引效率,以及覆盖查询...

Global site tag (gtag.js) - Google Analytics