MongoDBが__id
_インデックスを使用するのはいつですか?
Index Introduction 、 Analyze Query Performance 、および Query Plans では、それについて具体的な情報は見つかりませんでした。
.sort({_id: -1})
を介したクエリの最後で__id
_で並べ替えると、.explain()
は明示的にインデックスの使用を示します。ただし、すべてのCOLLSCAN
操作で暗黙的に使用されている可能性があります。
それは、__id
_による並べ替え/クエリ時にのみアクセスされる通常のインデックスだけですか、それとも.explain()
では表示されない非表示の用途がありますか?
.sort({_ id:-1})を介したクエリの最後で_idでソートする場合、.explain()はインデックスの使用を明示的に示します。ただし、すべてのCOLLSCAN操作で暗黙的に使用されている可能性があります。
COLLSCAN操作はコレクションスキャンです。これは、インデックスが使用されておらず、コレクションが 自然順序 で反復されていることを示します。
クエリに条件がなく、__id
_による並べ替えを要求した場合、__id
_インデックスが期待される順序で結果を返すための最良の候補になります。 MongoDB 3.0では、これがCOLLSCANではなくIXSCANとして示されることを期待しています。
_idで並べ替え/クエリを実行するときにのみアクセスされるのは、通常のインデックスだけですか?
ご想像のとおり、__id
_インデックスは通常のインデックスであり、__id
_によるクエリまたは並べ替えの際にクエリプランナーによって選択される候補です。
.explain()で表示されない非表示の用途がありますか
explain()
results は、関連するクエリ計画情報を表示しますが、デフォルトでは、成功した計画の概要のみが含まれます。 .explain(true)
を使用すると、より詳細な情報(評価された候補プランなど)を表示できます。
MongoDB 3.0のexplain()
には、実際には3つの冗長モードがあります。
queryPlanner
:デフォルトexecutionStats
:受賞プランの詳細allPlansExecution
(別名true
):すべての計画に関する情報__id
_インデックスの使用法は他にもいくつかありますが、完全には隠されていませんが、明確ではない場合があります。
レプリケーションには一意の__id
_インデックスが必要です(歴史的メモ:MongoDB 2.2より前のバージョンでは、__id
_インデックスなしでキャップされたコレクションを作成および複製することが可能でした)。
a snapshot
cursor コレクションを__id
_の順序で反復して、クエリがドキュメントを複数回返さないようにします。
MongoDBでは、コレクションに格納されたドキュメントには、主キーとして機能する一意の_idフィールドが必要です。 MongoDBは、_idフィールドが指定されていない場合、_idフィールドのデフォルト値としてObjectIdsを使用します。つまり、ドキュメントに最上位の_idフィールドが含まれていない場合、MongoDBドライバーはObjectIdを保持する_idフィールドを追加します。さらに、mongodが_idフィールドを含まない挿入するドキュメントを受け取った場合、mongodはObjectIdを保持する_idフィールドを追加します。
ObjectId is a 12-byte BSON type, constructed using:
a 4-byte value representing the seconds since the Unix Epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.
MongoDBクライアントは、一意のObjectIdを持つ_idフィールドを追加する必要があります。 _idフィールドにObjectIdを使用すると、次の追加の利点があります。
代替案-以下は、_idの値を格納するための一般的なオプションです。
詳細については MongoDBを参照