MongoDBクエリプロファイラ


数ヶ月前、私はいくつかの集約されたデータを表示するためにWebページを作成していましたが、すぐにデータを取得するために使用されるAPIは非常に遅いことに気づいた.可能な問題を調査した後,ボトルネックを発見した.解決策は、Webページからそれを消耗させるためにデータを再構成することでした.
私は時々SQLServerプロファイラを使用していましたが、MongoDBのプロファイラーについての経験はありませんでした.したがって、ここでは、MongoDBクエリを分析するための手順の下にあります.

It doesn't apply to our case, but in many situations performance problems are related to missing or wrongly implemented MongoDB Indexes.



MongoDBプロファイラを有効にする
デフォルトでは、MongoDBはどんなクエリもプロファイルしません.プロファイルレベルの実行を設定することができます.
db.setProfilingLevel(<profile_level>)
どこprofile_level は以下のようになります.
  • 0 - プロファイラはオフですので、データを収集しません.
  • 1 - プロファイラは、操作がslowms (設定可能な閾値).
  • 2 - プロファイラはすべての操作のデータを収集します.
  • IMPORTANT: At the end of the analysis, please remember to disable profiling with: db.setProfilingLevel(0), since that it can affect MongoDB performance.



    直近のクエリプロファイルを取得する
    プロファイルが有効になったら、最後の問い合わせをプロファイル(検索レベルを設定した後に実行する必要があります)を取得します.
    db.system.profile.find().limit(1).sort({ts:-1}).pretty()
    

    説明する
    The explain command それは多くの一般的な操作に関する情報を提供するので、便利になりますaggregate , count , distinct , find , findAndModify , delete and update . それにもかかわらず、同じ名前のメソッドはcollection and cursor また.
    それで、我々が情報を分析したいならばaggregate 操作を実行できます:
    db.<collection_name>.explain(<verbosity>).aggregate(...)
    
    ここで
  • <collection_name> 集約が実行されるコレクションの名前です
  • <verbosity> 我々が抽出したい冗長性のレベルです.

  • 冗長性を説明する
    The explain コマンドは以下の冗長レベルのいずれかを受け付けます:
  • queryPlanner - It returns the queryPlanner 優勝プラン評価に関する情報.
  • executionStats - It returns queryPlannerexecutionStats しかし、拒否された計画は後者に含まれません.
  • allPlansExecution - It returns queryPlannerexecutionStats すべての評価された計画についての情報.

  • 結論
    MongoDBによってクエリが実行されたことを理解するだけで、パフォーマンスを向上させることができました.

    Not our case, but I would remind that performance problems are often associated to missing or wrongly implemented indexes. If so, please have a look at MongoDB Indexes.



    資源
  • MongoDB database profiler
  • Explain results
  • MongoDB Indexes