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/