MongoDBでインデックスとexplainを使う

事前データ準備

 for (var i=0; i<100; i++) { db.test_object.save({name: "test1", num: i}) }
 for (var i=0; i<100; i++) { db.test_object.save({name: "test2", num: i*1000}) }
 for (var i=0; i<100; i++) { db.test_object.save({name: "test3", num: i*10000}) }

stringは3種類100個ずつ、numはuniqueなオブジェクトを作成します。

インデックス作成

db.test_object.ensureIndex({"name": 1})

で、test_objectコレクションのnameに対してインデックスを作成できます。

また、

db.test_object.getIndexes()

でインデックスを確認出来ます。

なお、MongoDBのばあい、インデックスに使用したキーが存在しない場合もあります。 そのような場合は、キーを持っていないものはNULLとして扱われます。

explain

検索したときにindexが使われているかはexplainで確認出来ます。

db.test_object.find({"name": "test1", "num": 10}).explain()
{
        "cursor" : "BtreeCursor name_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 100,
        "nscanned" : 100,
        "nscannedObjectsAllPlans" : 100,
        "nscannedAllPlans" : 100,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "string" : [
                        [
                                "test1",
                                "test1"
                        ]
                ]
        },
        "server" : "ota42y:27017",
        "filterSet" : false
}

cursorが BasicCursorではなく、
getIndexesで表示されたインデックス名が表示されていれば大丈夫です。

nscannedはキーを使って絞り込みをしたオブジェクトの数です。
この場合は事前の設定通り、100個の"test1"をキーに持つオブジェクトが引っかかっています。
その後numキーによって検索が行われ、
“n"の個数分(1件)表示されます。

できる限りn=nscannedに近くなるようにインデックスを貼ったり、
検索クエリを工夫するといいと思います。

詳しくはこちら
http://docs.mongodb.org/manual/reference/method/cursor.explain/