日期:2014-05-16  浏览次数:20456 次

mongodb索引与优化
一、基础索引
1、创建索引
db.test.ensureIndex({"username":1})
2、查询索引
db.test.getIndexes()
3、删除索引
db.test.dropIndex({"username":1})

-- 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。

4、复合索引
   db.test.ensureIndex({"username":1, "age":-1})
   该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,
   但是只是基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,
   必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,
   MongoDB可以智能的帮助我们调整该顺序
5、创建指定名称的索引
   db.test.ensureIndex({"username":1},{"name":"testindex"})   

二、唯一索引
  db.test.ensureIndex({"userid":1},{"unique":true})
  db.test.ensureIndex({"userid":1,"age":1},{"unique":true})  
  创建唯一索引,并消除重复数据。
  db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
 
三、使用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})