最適化する必要がある遅い操作を見つけるために、いくつかのMongoログをgrepしようとしています。スロークエリロギングはデフォルトであり、100msを超えるオペレーションのロギングです。
COLLSCANSの検索を一般的に話すと、注意が必要なクエリが表示されると言っても安全だと思います。あまり明確でないのは、IXSCANSが詳細である場合、検索する必要があるということです。
ここでMongoDBのドキュメントを検討してください:
https://docs.mongodb.com/manual/reference/explain-results/#collection-scan-vs-index-use
私の理解では、これはバイナリの状況であり、クエリはCOLLSCANまたはIXSCANです。したがって、IXSCANをgrepすると、COLLSCANSでないすべての低速クエリが表示されます。これは本当ですか?
最適化する必要のある遅い操作を見つけるために、いくつかのMongoログをgrepしようとしています。スロークエリロギングはデフォルトであり、100msを超えるオペレーションのロギングです。
MongoDBログをgrepするのではなく、オープンソースのスクリプトを使用することを強くお勧めします mtools
project 。注:私は元のmtools
作成者ではありませんが、貢献者です。
mtools
は、Pythonスクリプトのコレクションです。これは、GBのログをgrepして、MongoDBの本番環境の配置に関連する情報を見つけようとする苦労に触発されました。主要なスクリプトは、連続するフィルター(例:_mlogfilter --scan | mplotqueries
_)を介して出力をパイプ処理する一般的なコマンドラインワークフローに適合します。
例えば:
mloginfo --queries
_ は良い出発点です。クエリパターンを集約するので、頻繁に実行され、展開に全体的な影響を与えるクエリに集中できます。mlogfilter
は基本的にMongoDBログのgrepです。名前空間、期間、接続、パターン、およびその他の基準でログ行をフィルタリングできます。 _--scan
_ オプションは、必ずしもコレクションスキャンではない非効率的なクエリを識別するのに役立ちます。mplotqueries
はログを視覚化するためのツールであり、パターンや外れ値を特定するのに非常に役立ちます。COLLSCANSの検索を一般的に話すと、注意が必要なクエリが表示されると言っても安全だと思います。あまり明確ではないのは、IXSCANSが詳細である場合、検索する必要があるということです。
コレクションスキャンは一般的に重要ですが、1回限りのクエリまたは小規模なコレクションでの予想される使用の結果である可能性もあります。クエリの種類に焦点を当てるのではなく、展開の遅いクエリ(または一般に遅い操作)を確認して、何を改善できるかをよりよく理解します。インデックスの使用は通常は適切ですが、非効率的なインデックスの使用法(たとえば、メモリ内の並べ替えや 大文字と小文字を区別しない正規表現 )があり、対処する価値があります。
私の理解では、これはバイナリの状況であり、クエリはCOLLSCANまたはIXSCANです。したがって、IXSCANをgrepすると、COLLSCANSでないすべての低速クエリが表示されます。これは本当ですか?
IXSCAN
をgrepすると、IXSCAN
を含むすべてのログ行が見つかりますが、クエリのスローロギングの結果はバイナリではなく、MongoDBサーバーのバージョンによっても異なります。効率的なインデックスの使用は明らかな最適化ですが、クエリのパフォーマンスの理解に関連する可能性のある内部 クエリプランナーステージ がいくつかあります。
ログで興味深い低速のクエリが見つかった場合、次のステップは通常、より詳細な _explain output
_ を確認することです。私はexplain(true)
(aka allPlansExecution
mode)を使用します。これは、考慮されたクエリプランと落札したプランの詳細を示すためです。遅いクエリのExplain出力の解釈方法がわからない場合は、 DBA StackExchange に投稿することをお勧めします。
クエリの説明は、ワークロードの実際のパフォーマンスの測定値ではないことに注意してください。通常の操作では、クエリプランはキャッシュされますが、詳細なexplain
出力は、候補インデックスとクエリプランを具体的に再評価します。詳細については、MongoDBマニュアルの Query Plans を参照してください。