MongoDB クエリ分析
MongoDB クエリ分析は、作成したインデックスが有効かどうかを確認でき、クエリ文のパフォーマンス分析のための重要なツールです。
MongoDB クエリ分析でよく使われる関数には、explain() と hint() があります。
explain() を使用する
explain 操作は、クエリ情報、使用したインデックス、クエリ統計などを提供します。これはインデックスの最適化に役立ちます。
次に、users コレクションに gender と user_name のインデックスを作成します:
>db.users.ensureIndex({gender:1,user_name:1})
次に、クエリ文で explain を使用します:
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
上記の explain() クエリは以下のような結果を返します:
{
"cursor" : "BtreeCursor gender_1_user_name_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 0,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"gender" : [
[
"M",
"M"
]
],
"user_name" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
それでは、この結果セットのフィールドを見てみましょう:
- indexOnly: フィールドが true の場合、インデックスを使用したことを示します。
- cursor: このクエリはインデックスを使用しているため、MongoDB ではインデックスは B ツリー構造に格納されるので、BtreeCursor タイプのカーソルも使用されています。インデックスを使用しない場合、カーソルのタイプは BasicCursor です。このキーは使用したインデックスの名前も示します。この名前を使って、現在のデータベースの system.indexes コレクション(システムが自動的に作成し、インデックス情報を格納します。これについては後で少し触れます)を参照して、インデックスの詳細情報を取得できます。
- n: 現在のクエリが返すドキュメント数。
- nscanned/nscannedObjects: 今回のクエリでコレクション内のドキュメントを合計何件スキャンしたかを示します。目的は、この数値が返されたドキュメント数にできるだけ近づくことです。
- millis: 現在のクエリに必要な時間(ミリ秒)。
- indexBounds: 現在のクエリが実際に使用したインデックス。
hint() を使用する
MongoDB のクエリオプティマイザは一般に非常にうまく機能しますが、hint を使用して MongoDB に特定のインデックスを強制的に使用させることもできます。
この方法は、特定の状況でパフォーマンスを向上させることがあります。インデックスが設定されたコレクションで、複数フィールドのクエリ(一部のフィールドにはすでにインデックスが設定されている)を実行する場合などです。
次のクエリ例では、gender と user_name のインデックスフィールドを使用してクエリを指定しています:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
explain() 関数を使用して上記のクエリを分析できます:
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
その他の拡張