MongoDBには データベースプロファイラー が含まれています。これは低速クエリを識別し、クエリ パフォーマンスの向上方法を決定するのに役立ちます。
このタスクについて
パフォーマンス、ストレージ、セキュリティ
このタスクは、 データベースプロファイラを使用して、実行中の mongod
インスタンスでの低速クエリを識別します。有効にすると、データベースプロファイラはパフォーマンスとディスク使用量に影響を与え、暗号化されていないクエリ データを公開する可能性があります。
警告
データベースプロファイラを本番環境の配置で使用する前に、パフォーマンス、ストレージ、およびセキュリティへの影響を検討してください。
Atlas クエリプロファイラー
Atlas ユーザーは Atlas クエリプロファイラー を利用して、 散布図チャートによる可視化の便利性で低速クエリを識別できます。
詳細については、「 クエリプロファイラーによるクエリ パフォーマンスの監視 」を参照してください。
低速クエリ
低速クエリとは、実行に指定された時間よりも長い時間がかかるクエリです。このタスクでは、低速クエリしきい値は 100 ミリ秒に設定されています。
ユースケースによっては、クエリの実行速度が必要になる場合があります。他のクエリでは、しきい値を引き上げて、最も遅いクエリのみに集中する必要がある場合があります。
特定のアプリケーションとデータベースのニーズを反映する低速クエリしきい値を選択します。
Context
有効にすると、データベースプロファイラはデータベース レベルのクエリのみを監視します。複数のデータベースの低速クエリを監視するためにプロファイラーが必要な場合は、各データベースで db.setProfilingLevel()
メソッドを実行します。
シャーディングされたクラスター
データベースプロファイラはmongos
では使用できません。
手順
データベースプロファイラを有効にします。
データベースプロファイラが低速クエリをモニターできるようにするには、db.setProfilingLevel()
メソッドを使用します。
db.setProfilingLevel(1, 100)
{ was: 0, slowms: 1, sampleRate: 1, ok: 1}
これにより、プロファイリング レベルが 1
に設定されます。これにより、低速クエリがモニターされ、クエリの実行時間が 100 ミリ秒を超えると、そのクエリは低速と定義されます。
低速クエリを確認します。
データベースプロファイラによって見つかった低速クエリを一覧表示するには、 system.profile
コレクションで関連データをクエリします。
db.system.profile.find( { }, { command: 1, millis: 1, docsExamined: 1, keysExamined: 1, nreturned: 1 } ).sort( { ts: -1 } )
[ { command: { find: 'people', filter: { age: { '$gt': 35 } }, lsid: { id: UUID('ae3e9932-0a78-47ab-b741-01dd3bfb3563') }, '$db': 'contacts' }, keysExamined: 0, docsExamined: 100000, nreturned: 40, millis: 143 } ]
コマンドは、データベースプロファイラによって監視された低速クエリのリストを提供します。
プロジェクションは、返されたドキュメントをフィルタリングして、クエリが遅く実行された原因を判断するのに役立つ情報を含めます。
keysExamined
が0
の場合、クエリではインデックスが使用されなかったことを示します。この問題を解決するには、コレクションにインデックスを作成します。インデックスが使用されており、
docsExamined
がnreturned
より大幅に大きい場合は、非効率的なインデックスを示します。クエリフィルターで使用されるフィールドでは、インデックスを更新するか、新しいインデックスを作成する必要がある場合があります。keysExamined
が高く、docsExamined
が低い場合は、インデックスの使用が効果的であることを示します。
例
Ignore Indexes
インデックスを持つコレクションのパフォーマンスを評価するには、hint( {
$natural: 1 } )
メソッドを使用してインデックスを無視するようにクエリを設定します。
db.listingsAndReviews.find( { $or: [ { "address.market": "Berlin" }, { "review_scores.review_scores_cleanliness": { $lt: 5 } } ], $where: function () { return this.amenities && this.amenities.length > 15; } } ).sort( { description: 1 } ).hint( { $natural: 1 } );
これは、コレクションスキャンとインデックススキャンのクエリのパフォーマンスを比較する場合に役立つ場合があります。