インデックスを使用していない、または遅いmongodbのクエリを見つける方法はありますか? MySQLでは、構成ファイル内の次の設定で可能です。
log-queries-not-using-indexes = 1
log_slow_queries = /tmp/slowmysql.log
MongoDBでの同等のアプローチは、 query profiler を使用して、遅いクエリを追跡および診断することです。
データベースのプロファイリングを有効にすると、遅い操作がsystem.profile
上限付きコレクション(デフォルトではサイズ1Mb)。 slowms
パラメーター を使用して、遅い操作(デフォルトでは100ms)のしきい値を調整できます。
最初に、必要なログレベルを指定して、プロファイリングを設定する必要があります。 3つのオプションは次のとおりです。
これを行うには、mongod
デーモンを_--profile
_オプションで実行します。
_mongod --profile 2 --slowms 20
_
これにより、ログは_system.profile
_コレクションに書き込まれ、次のようにクエリを実行できます。
db.system.profile.find( { ns:/<db>.<collection>/ } ).sort( { ts: 1 } );
db.system.profile.find( {millis : { $gt : 5 } } ).sort( { ts: 1} );
次の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.
コマンドラインツール 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
....
この古い質問で誰かがGoogleからここに来た場合、explain
がログからCOLLSCAN
sを引き起こしていた特定のクエリを修正するのに本当に役立つことがわかりました。
例:
db.collection.find().explain()
これにより、クエリがCOLLSCAN
(基本カーソル)またはindex
(BTree)などを使用しているかどうかがわかります。
https://docs.mongodb.com/manual/reference/method/cursor.explain/