12

の出力を.explain()MongoDBクエリで使用すると、との違いを確認してnnscanned完全なコレクションスキャンが実行されたかどうか、またはインデックスが使用されたかどうかを判断できることを理解しています。ドキュメントの状態

あなたは、可能な限り価値を近づけたいnと思っています。nscanned

カイルバンカーの優れた本MongoDBinActionは、非常によく似たものを述べています。

一般的に言えば、との値をnできるだけnscanned近づける必要があります。コレクションスキャンを実行する場合、これはほとんどありません。

明らかに、これらのステートメントはどちらも、との比較について決定的なものではありませnnscanned。一般に、コレクション全体のスキャンを推測する差異の割合は10%、20%、30%以上ですか?フルコレクションスキャンが実行されたかどうかを確認する他の方法はありますか?

4

5 に答える 5

26

上記の答えは完全には正しくありません。

インデックスが並べ替えに使用されているが、一致基準を支援できない場合にも、コレクションスキャンが実行されます。このような場合、すべてのドキュメントが(インデックス順に)スキャンされ、検索条件に一致するドキュメントが検索されます。もう1つの可能性は、部分的なコレクションスキャンが存在する可能性があります。この場合、インデックスは1つ以上の検索基準に従ってドキュメントのサブセットを絞り込むことができますが、完全な検索基準に一致するものを見つけるには、このドキュメントのサブセットをスキャンする必要があります。

このような状況では、explainは、BasicCursorではなく、使用されているインデックスを表示します。したがって、explainにBasicCursorが存在することは、コレクションスキャンが実行されていることを示していますが、それが存在しないことは、コレクションスキャンが実行されなかったことを意味するわけではありません。

また、-notablescanを使用しても、インデックスが並べ替えに使用される場所には役立ちません。クエリは、インデックスが使用されていない場合にのみ例外を発生させるためです。インデックスが一致または並べ替えに使用されたかどうかは検索されません。

コレクションスキャンが実行されたかどうかを判断する唯一の確実な方法は、インデックスキーをクエリの一致基準と比較することです。クエリオプティマイザーによって選択された(そしてexplainに示されている)インデックスがクエリ一致基準(つまり、異なるフィールド)に答えることができない場合は、コレクションスキャンが必要です。

于 2013-05-21T22:18:00.897 に答える
7

一般に、コレクション全体のスキャンを推測する差異の割合は10%、20%、30%以上ですか?

これを言うことは不可能ですが、それが本当に1トン全体に重要である場合、平均的な検索で最大200%のパフォーマンスの低下が見られる可能性があります。そうです、あなたはそれに気付くでしょう。これは、この面で他のデータベースとよく似ています。

フルコレクションスキャンが実行されたかどうかを確認する他の方法はありますか?

全表スキャンを実行しないように指示するフラグを使用してMongoDBを起動できます。その場合、次のようにしようとすると例外がスローされます。http: //docs.mongodb.org/manual/reference/mongod/#cmdoption- mongod--notablescan

ただし、ここで使用するのが最善の方法ですexplain。クエリがインデックスを使用せず、ディスクまたはメモリからコレクション全体をスキャンする必要がある場合がわかります。

于 2013-03-09T21:20:18.967 に答える
1

決定的な答えは、explain()出力の最初の行にあります。

カーソルタイプが「BasicCursor」と表示されている場合は、単純なコレクションスキャンでした。

それ以外の場合は、使用したインデックスのタイプとインデックスの名前、つまり「BtreeCursorid」が表示されます

同じ説明については、http: //docs.mongodb.org/manual/reference/explain/#explain-output-fields-coreのドキュメントを参照してください。

于 2013-03-09T22:19:14.503 に答える
0

厳密には、カーソルが基本カーソルの場合にのみ全表スキャンが実行されたようです。

btreeカーソルがある場合は、レコードを見つけるために全表スキャンが効果的に実行されている可能性があり、そのbtreeインデックスは並べ替えにのみ使用されています。ただし、explainの出力を見ると、レコードを数えたり、既存のインデックスを調べたりせずに、全表スキャンであったことを本当に確認できますか。

質問の文脈で、クエリが効率的でなく、より良いインデックスが必要であるか、またはヒントが必要であるかどうかは明らかです。

于 2014-08-06T15:32:59.120 に答える
0

Explainのステージを確認できます(MongoDBドキュメントから):

ステージは操作を説明します。例えば

-コレクションスキャン用の
COLLSCAN-インデックスキーをスキャンするためのIXSCAN-
ドキュメントを取得するための
FETCH-シャードからの結果をマージするためのSHARD_MERGE

于 2015-09-19T06:35:14.040 に答える