2016-07-25 2 views
1

私が理解している限り、explain()メソッドのnscannedObjectsエントリは、MongoDBがディスク内で見つけるために必要としたドキュメントの数を意味します。nscannedObjects = 0とはどういう意味ですか?

私の質問は:この値が0の場合、上記の説明以外に実際に何を意味するのでしょうか? MongoDBはそこに保存されたいくつかの文書をキャッシュに保持しますか?

+0

インデックスが使用されたことを意味します。索引は、高速検索を可能にする文書の一部のみを含むデータ構造です。 – mszymborski

+0

それはまさに私を混乱させるものです。 MongoDBのメモリは、索引を含む配列(または他の同様のデータ構造)のように(ドキュメントが実際に格納されているディスク内のオブジェクトへのポインタ/参照として)想像します。しかし、これはnscannedObjects = 0と衝突します。これは、MongoDBがディスクに移動する必要がないためです。どこが間違っていますか? –

+0

indexはツリーのようなデータ構造全体です。そこにはいくつかの属性から_idへのリンクが含まれています。検索条件がインデックスに完全に基づいている場合は、インデックスのみを見ることができます。ドキュメント選択のための詳細情報を提供していないため、ドキュメントそのものではありません。それは、mongoがドキュメントを最終的にFETCHすることを意味するものではなく、選択フェーズではフェッチされなかったということだけです。 – mszymborski

答えて

0

Mongoは文書データベースであり、保存された文書の構造を解釈することができます(たとえば、Key-Valueストアとは異なります)。

このアプローチの利点の1つは、データベース内のドキュメントにインデックスを作成できることです。

インデックスはデータ構造(通常はb-treeのバリアント)で、一部の属性に基づいたドキュメントの高速検索が可能です(例:id(!= _id)または他の特徴的なもの)。

インデックス付きの属性に基づいた文書を検索すると(例えば、id> 50とする)、mongoはメモリ/ディスク/任意のものから文書をフェッチする必要はありませんどのドキュメントがインデックスだけに基づいた基準に一致しているかを見ることができます(ディスクから何かを取得することは、キャッシュがなくてもメモリ検索よりも数桁遅いことに注意してください)。 oさらに処理するために文書をフェッチします(また、あなたが引用した統計には該当しません)。

インデックスは、高性能を達成するために重要ですが、欠点もあります(たとえば、めったに使用されないインデックスは、挿入を遅くする可能性があり、挿入するたびにインデックスを更新する必要があります)。

+0

私は参照してください。したがって、nscannedObjectsは、MongoDBがクエリのフィルタと一致するものを見つけるためにディスクからフェッチするために必要なドキュメントの数ですが、ディスクから実際にフェッチして出力として返されるものは見つかりませんでした。 –

+0

おそらくnFetchedDocumentsと呼ばれるもう1つの統計があります。この統計は、最後にフェッチされた数を正確に示しています。 – mszymborski

1

nscannedObjects = 0は、クエリを満たすフェッチまたはフィルタリングがなかったことを意味し、クエリはインデックスのみに基づいて解決されました。たとえば、{_id:10}を照会し、一致する文書がない場合は、nscannedObjects = 0となります。

メモリ内のデータとは関係がありません。クエリプランとの区別はありません。もう少し自明であるMongoDBの3.0以降でnscannedとnscannedObjectsが今totalKeysExaminedとtotalDocsExaminedと呼ばれていることを

注意、。

関連する問題