來源:http://francs3.blog.163.com/blog/static/40576727201210202322706/

關于索引的創建在之前的 創建索引 blog 中已有描述,
接下來看看 MongoDB 的執行計劃,通過使用 explain()  方法可以很容易的查看執行計劃。


--1 查看索引

 > db.test_4.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "skytf.test_4",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "skyid" : 1
                },
                "ns" : "skytf.test_4",
                "name" : "idx_test_4_skyid",
                "background" : true
        }
]
   


--2 查看執行計劃

 db.test_4.find({skyid:1}).explain();
{
        "cursor" : "BtreeCursor idx_test_4_skyid",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 9,
        "indexBounds" : {
                "skyid" : [
                        [
                                1,
                                1
                        ]
                ]
        },
        "server" : "redhatB.example.com:27017"
}
   

  備注: 上面為 mongodb 的執行計劃,部分參數意思為以下:
        cursor:   值為 BasicCursor  或 BtreeCursor,后者表示此查詢使用了索引
        nscanned: 掃描的索引項
        n:         返回的文檔數,即返回的行
        millis:   完成此查詢所需的時間,單位為毫秒
        indexBounds: 如果不為空,表示此查詢使用的索引項
       
       
   MongoDB 也能強制使用索引,通過使用 hint() ,感覺非常強大!


--3 刪除老索引

 > db.test_4.dropIndexes('idx_test_4_skyid');
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
   


--4 新建索引

 db.test_4.ensureIndex({skyid:1,name:1},{name:"idx_test_4_skyid_name",background:true}); 
   


--5 查看索引

 db.test_4.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "skytf.test_4",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "skyid" : 1,
                        "name" : 1
                },
                "ns" : "skytf.test_4",
                "name" : "idx_test_4_skyid_name",
                "background" : true
        }
]
   
   備注:索引 "idx_test_4_skyid_name" 已創建。


--6 沒使用索引的查詢

 > db.test_4.find({name:'a'}).explain();
{
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 100001,
        "nscannedObjects" : 100001,
        "nscanned" : 100001,
        "nscannedObjectsAllPlans" : 100001,
        "nscannedAllPlans" : 100001,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 1,
        "nChunkSkips" : 0,
        "millis" : 156,
        "indexBounds" : {

        },
        "server" : "redhatB.example.com:27017"
}

   
  備注: indexBounds 為空表示沒使用索引。


--7 強制查詢使用索引

 db.test_4.find({name:'a'}).hint({skyid:1,name:1}).explain();
{
        "cursor" : "BtreeCursor idx_test_4_skyid_name",
        "isMultiKey" : false,
        "n" : 100001,
        "nscannedObjects" : 100001,
        "nscanned" : 100001,
        "nscannedObjectsAllPlans" : 100001,
        "nscannedAllPlans" : 100001,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 263,
        "indexBounds" : {
                "skyid" : [
                        [
                                {
                                        "$minElement" : 1
                                },
                                {
                                        "$maxElement" : 1
                                }
                        ]
                ],
                "name" : [
                        [
                                "a",
                                "a"
                        ]
                ]
        },
        "server" : "redhatB.example.com:27017"
}

   備注:indexBounds 不為空表示已使用索引,并且 cursor 字段顯示了使用的索引名稱。
  

--8 參考
http://docs.mongodb.org/manual/reference/javascript/#cursor.explain
http://docs.mongodb.org/manual/reference/javascript/#cursor.hint