MongoDBのexplain()でクエリプランを確認する方法
MongoDBでクエリの実行計画(クエリプラン)を確認したい場合は、explain()メソッドを使用します。これにより、クエリがどのように実行されるか、インデックスが使われているかどうかなどを把握でき、パフォーマンスチューニングに役立ちます。
ここでは、実際にコレクションを作成してドキュメントを挿入し、explain()でクエリプランを表示するまでの手順を順番に解説します。
1. コレクションの作成とドキュメントの挿入
まず、insertOne()メソッドを使ってサンプルドキュメントをコレクション「demo202」に挿入します。
> db.demo202.insertOne({"StudentFirstName":"Chris","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c3bd103d395bdc21346e8")
}
> db.demo202.insertOne({"StudentFirstName":"David","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c3bd803d395bdc21346e9")
}
> db.demo202.insertOne({"StudentFirstName":"Bob","StudentAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c3bde03d395bdc21346ea")
}上記のコマンドでは、「StudentFirstName」と「StudentAge」というフィールドを持つ3件の学生ドキュメントを登録しています。
2. find()メソッドですべてのドキュメントを表示
挿入したすべてのドキュメントは、find()メソッドで確認できます。
> db.demo202.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e3c3bd103d395bdc21346e8"), "StudentFirstName" : "Chris", "StudentAge" : 21 }
{ "_id" : ObjectId("5e3c3bd803d395bdc21346e9"), "StudentFirstName" : "David", "StudentAge" : 23 }
{ "_id" : ObjectId("5e3c3bde03d395bdc21346ea"), "StudentFirstName" : "Bob", "StudentAge" : 22 }3. explain()でクエリプランを表示する
続いて、クエリプランを表示するためのexplain()の使い方です。find()の結果に対してexplain()を呼び出すだけでOKです。
> db.demo202.find({"StudentFirstName":"David"}).explain();実行結果は以下のとおりです。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.demo202",
"indexFilterSet" : false,
"parsedQuery" : {
"StudentFirstName" : {
"$eq" : "David"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"StudentFirstName" : {
"$eq" : "David"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-QN2RB3H",
"port" : 27017,
"version" : "4.0.5",
"gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412"
},
"ok" : 1
}4. 出力結果の見方
explain()の出力には重要な情報が含まれています。主なポイントは以下のとおりです。
- queryPlanner:クエリプランナーによる評価結果が格納されます。
- parsedQuery:MongoDBが解析したクエリ条件。「$eq」は等価比較を意味します。
- winningPlan:実際に選択された実行プランです。
- stage: "COLLSCAN":コレクションスキャンを示します。これはインデックスを使用せず、コレクション内の全ドキュメントを走査することを意味します。
- rejectedPlans:候補として検討されたものの、採用されなかったプランの一覧です。
今回の例ではインデックスが作成されていないため、COLLSCAN(全件スキャン)が選択されています。データ量が多い場合にパフォーマンスを改善したいなら、該当フィールドにインデックスを作成して再度explain()を実行すると、IXSCAN(インデックススキャン)に変わることを確認できます。
なお、より詳細な実行統計(処理時間や走査したドキュメント数など)を取得したい場合は、explain("executionStats")のように引数を指定する方法もあります。
-
MongoDBで_idを使ってグループ化するクエリの書き方
MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true
-
MongoDBでコレクションの名前を変更する方法(renameCollectionの使い方)
MongoDBで既存のコレクションの名前を変更したい場合、renameCollection()メソッドを使用します。この記事では、実際にコレクションを作成し、その名前を変更するまでの手順を順番に解説します。1. ドキュメントを含むコレクションを作成するまず、insertOne()メソッドを使ってサンプルドキュメントを挿入し、コレクション「demo690」を作成します。> db.demo690.insertOne({_id:101,Name:Sam}); { acknowledged : true, insertedId : 101 } > db.demo690.insertOne(