web-dev-qa-db-ja.com

mongodbでインデックスを使用していない、または遅いクエリを見つける方法

インデックスを使用していない、または遅いmongodbのクエリを見つける方法はありますか? MySQLでは、構成ファイル内の次の設定で可能です。

log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
23
DmitrySemenov

MongoDBでの同等のアプローチは、 query profiler を使用して、遅いクエリを追跡および診断することです。

データベースのプロファイリングを有効にすると、遅い操作がsystem.profile上限付きコレクション(デフォルトではサイズ1Mb)。 slowmsパラメーター を使用して、遅い操作(デフォルトでは100ms)のしきい値を調整できます。

18
Stennie

最初に、必要なログレベルを指定して、プロファイリングを設定する必要があります。 3つのオプションは次のとおりです。

  • 0-ロガーオフ
  • 1-遅いクエリをログに記録する
  • 2-すべてのクエリを記録する

これを行うには、mongodデーモンを_--profile_オプションで実行します。

_mongod --profile 2 --slowms 20_

これにより、ログは_system.profile_コレクションに書き込まれ、次のようにクエリを実行できます。

  • タイムスタンプの昇順で並べ替えて、コレクション内のすべてのログを検索します。

db.system.profile.find( { ns:/<db>.<collection>/ } ).sort( { ts: 1 } );

  • 5ミリ秒を超えるクエリのログを探します。

db.system.profile.find( {millis : { $gt : 5 } } ).sort( { ts: 1} );

14
Rafael Eyng

次の2つのmongodオプションを使用できます。最初のオプションはインデックスを使用しないクエリに失敗します(V 2.4のみ)、2番目のオプションはクエリがいくつかのmsしきい値より遅いクエリを記録します(デフォルトは100msです)

--notablescan

Forbids operations that require a table scan.

--slowms <value>

Defines the value of “slow,” for the --profile option. The database logs all slow queries to the log, even when the profiler is not turned on. When the database profiler is on, mongod the profiler writes to the system.profile collection. See the profile command for more information on the database profiler.
6
Ori Dar

コマンドラインツール mongotail を使用して、コンソール内でプロファイラーからログを読み取りやすくすることができます。

最初にプロファイラーをアクティブにし、プロファイルがミリ秒単位でしきい値を設定して、操作が遅いと見なします。次の例では、「sales」という名前のデータベースのしきい値が10ミリ秒に設定されています。

$ mongotail sales -l 1
Profiling level set to level 1
$ mongotail sales -s 10
Threshold profiling set to 10 milliseconds

次に、「リアルタイム」で、各クエリにかかった時間や、必要なレジストリの数などの追加情報を含む遅いクエリを確認します。特定の結果を見つけるには:

$ mongotail sales -f -m millis nscanned docsExamined
2016-08-11 15:09:10.930 QUERY   [ops] : {"deleted": {"$exists": false}, "prod_id": "367133"}. 8 returned. nscanned: 344502. millis: 12
2016-08-11 15:09:10.981 QUERY   [ops] : {"deleted": {"$exists": false}, "prod_id": "367440"}. 6 returned. nscanned: 345444. millis: 12
....
3
Mariano Ruiz

この古い質問で誰かがGoogleからここに来た場合、explainがログからCOLLSCANsを引き起こしていた特定のクエリを修正するのに本当に役立つことがわかりました。

例:

db.collection.find().explain()

これにより、クエリがCOLLSCAN(基本カーソル)またはindex(BTree)などを使用しているかどうかがわかります。

https://docs.mongodb.com/manual/reference/method/cursor.explain/

1
Brian Morton