MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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")のように引数を指定する方法もあります。

  1. MongoDBで_idを使ってグループ化するクエリの書き方

    MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true

  2. MongoDBでコレクションの名前を変更する方法(renameCollectionの使い方)

    MongoDBで既存のコレクションの名前を変更したい場合、renameCollection()メソッドを使用します。この記事では、実際にコレクションを作成し、その名前を変更するまでの手順を順番に解説します。1. ドキュメントを含むコレクションを作成するまず、insertOne()メソッドを使ってサンプルドキュメントを挿入し、コレクション「demo690」を作成します。> db.demo690.insertOne({_id:101,Name:Sam}); { acknowledged : true, insertedId : 101 } > db.demo690.insertOne(