explain()
メソッドは、 MongoDB が指定されたクエリをどのように計画して実行するかに関する情報を提供します。この情報は、クエリ パフォーマンスのトラブルシューティングや最適化を計画する際に役立つ場合があります。
このタスクについて
Explain クエリ
explain()
メソッドは、次のメソッドを使用するクエリで使用できます。
プロファイラー
このタスクは、パフォーマンスの問題を特定するために、サンプルクエリでexplain()
メソッドを実行します。実際には、アプリケーションが実行するすべてのクエリでexplain()
を実行するのは難しい場合があります。
アプリケーションが送信するクエリのリストを遅いもののみに絞り込むには、プロファイラーを使用できます。
プロファイラー | 説明 |
---|---|
Atlas のカスタマーに 散布図チャートを提供し、低速クエリやパフォーマンスの例外を簡単に特定できるようにします。 | |
クエリ パフォーマンス情報をコレクションに保存し、特定のパフォーマンス問題を持つクエリをMongoDBに照会できます。 |
Atlas クエリプロファイラーとデータベースプロファイラ はどちらも、サーバーのパフォーマンスに影響を与え、ディスク領域を使用し、暗号化されたフィールドのクエリ メタメタデータを公開する可能性があります。有効にする前に、パフォーマンスとセキュリティへの影響を検討してください。
手順
クエリを説明します。
メソッドで評価するクエリを実行します。explain()
db.movies.explain( "executionStats").find( { year: { $gt: 1990 }, rated: { $in: [ "PG", "PG-13" ] } } )
実行時間を評価します。
explain.executionStats.executionTimeMillis
実行時間をミリ秒単位で確認するには、 フィールドを確認します。これは、プランの実行にかかる時間に加え、クエリプランのビルドと選択にかかる時間も含む合計時間を示しています。
実行時間がアプリケーションとデータベースのニーズに許容される期間内にある場合は、最適化は必要ありません。
実行時間が許容範囲を超えている場合は、クエリの実行に時間がかかる理由を判断するために、さらなる分析が必要になります。
実行ステージを評価します。
クエリは複数のステージで実行できます。各ステージで、 MongoDB は前のステージのドキュメントを収集して次の操作セットを実行します。explain.executionStats.executionStages
は各実行ステージに関する情報を提供します。 フィールドの各レベルは、 MongoDBinputStage
がステージのドキュメントを選択した方法を示します。
inputStage.stage
各実行ステージの フィールドを確認します。
COLLSCAN
- MongoDB がコレクションスキャンを実行したことを示します。
IXSCAN
- MongoDB がインデックススキャンを実行したことを示します。
FETCH
MongoDB がデータベースから完全なドキュメントを取得したことを示します。
クエリが返すフィールドの数は少なく、アプリケーションがこのコレクションで書き込み集中型ではない場合は、クエリをカバーするために インデックス の追加を検討してください。これにより、 MongoDB はドキュメント全体を読み取るのではなく、インデックスからフィールド値を取得できます。
詳細については、「 カバード クエリ 」を参照してください。
PROJECTION
- MongoDB がメモリ内のフィルタリングされたフィールドを返すことを示します。
SORT
- MongoDB がメモリ内のドキュメントをソートした、 または カバードインデックスを使用したことを示します。
COLLSCAN
ステージを表示するフィルタまたはソート操作を実行するクエリには、インデックスのメリットが得られます。
詳細については、「 インデックスの作成 」を参照してください。
キー調査を評価します。
インデックス付きのコレクションに対するクエリでは、インデックスが効果的に使用されない可能性があります。
検査されたキーの数と検査されたドキュメントの数を比較します。キーの数がドキュメント数より大幅に小さい場合は、インデックスが効果がなかったことを示します。
クエリの合計値を確認し、executionStats.totalDocsExamined
がexecutionStats.totalKeysExamined
より大きい値を表示していないことを確認します。
検査されたキーの数が検査されたドキュメントの数より大幅に少ない場合は、 フィールドの各ステージを確認し、executionStages
keysExamined
docsExamined
と を比較して、どのステージがインデックスの使用に失敗したかを判断します。次に、そのステージのクエリに対応するためのインデックスを作成します。
フィルターを評価します。
フィルター を使用して結果を指定するクエリでは、問題が発生する可能性があります。非効率的なフィルターを識別するには、 フィールドの値とexecutionStats.totalDocsExamined
executionStats.nReturned
フィールドの値を比較します。