MongoDBのクエリプランを理解する方法:explain()を使った実行計画の確認手順
MongoDBのクエリプランとは
MongoDBでは、クエリがどのように実行されるかを示す「クエリプラン(実行計画)」を確認できます。クエリプランを取得するには、explain()メソッドを使用します。このメソッドを使うことで、インデックスが使用されているか、どのステージでドキュメントが処理されているかなど、クエリ最適化に関する詳細な情報を得られます。
本記事では、実際にサンプルコレクションを作成し、explain()でクエリプランを確認する手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを挿入してコレクションを作成します。以下では、demo408というコレクションに複数のドキュメントを登録しています。
> db.demo408.insertOne({"Value":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70e3a115dc524f70227678")
}
> db.demo408.insertOne({"Value":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70e3a715dc524f70227679")
}
> db.demo408.insertOne({"Value":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70e3ac15dc524f7022767a")
}
> db.demo408.insertOne({"Value":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70e3af15dc524f7022767b")
}2. インデックスの作成
次に、Valueフィールドに対してインデックスを作成します。インデックスを作成しておくことで、クエリ実行時にインデックススキャン(IXSCAN)が利用できるようになります。
> db.demo408.createIndex({Value:1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}3. コレクション内のドキュメントを確認する
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo408.find();
実行すると、以下のように挿入した4件のドキュメントが出力されます。
{ "_id" : ObjectId("5e70e3a115dc524f70227678"), "Value" : 50 }
{ "_id" : ObjectId("5e70e3a715dc524f70227679"), "Value" : 20 }
{ "_id" : ObjectId("5e70e3ac15dc524f7022767a"), "Value" : 45 }
{ "_id" : ObjectId("5e70e3af15dc524f7022767b"), "Value" : 35 }4. explain()でクエリプランを確認する
ここからが本題です。explain()を使って、クエリの実行計画を確認します。以下の例では、「Value」が40より大きいドキュメントを検索するクエリのプランを取得しています。
> db.demo408.explain().find( { Value: { $gt: 40 } } );実行結果は以下の通りです。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.demo408",
"indexFilterSet" : false,
"parsedQuery" : {
"Value" : {
"$gt" : 40
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Value" : 1
},
"indexName" : "Value_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"Value" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Value" : [
"(40.0, inf.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-QN2RB3H",
"port" : 27017,
"version" : "4.0.5",
"gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412"
},
"ok" : 1
}実行結果の見方
出力結果には多くの情報が含まれていますが、特に注目すべきポイントは以下の通りです。
- winningPlan: MongoDBのクエリオプティマイザが選択した実行計画です。今回の例では、
FETCHステージの中でIXSCAN(インデックススキャン)が実行されています。これは、作成したインデックス「Value_1」がクエリで利用されていることを意味します。 - indexBounds: インデックスの走査範囲を示します。「(40.0, inf.0]」は、40より大きい値の範囲でインデックスが走査されたことを表しています。
- rejectedPlans: 採用されなかった実行計画の一覧です。今回は空なので、他の候補プランはありませんでした。
- parsedQuery: 実行したクエリ条件がどのように解析されたかを示します。
もしインデックスが使われていなければ、stageはCOLLSCAN(コレクションスキャン=全件検索)となり、大規模なコレクションではパフォーマンス低下の原因になります。explain()の出力を定期的にチェックすることで、クエリのボトルネックを早期に発見し、適切なインデックス設計につなげることができます。
まとめ
MongoDBでクエリのパフォーマンスをチューニングする第一歩は、explain()を使ってクエリプランを把握することです。インデックススキャンが正しく利用されているかを確認し、必要に応じてインデックスの追加やクエリの見直しを行いましょう。
-
MongoDBでコレクションの名前を変更する方法(renameCollectionの使い方)
MongoDBで既存のコレクションの名前を変更したい場合、renameCollection()メソッドを使用します。この記事では、実際にコレクションを作成し、その名前を変更するまでの手順を順番に解説します。1. ドキュメントを含むコレクションを作成するまず、insertOne()メソッドを使ってサンプルドキュメントを挿入し、コレクション「demo690」を作成します。> db.demo690.insertOne({_id:101,Name:Sam}); { acknowledged : true, insertedId : 101 } > db.demo690.insertOne(
-
MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法
MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...