(コレクションスキャンの実行と比較して)高速ルックアップを可能にするインデックスには、2つの関連する機能があります。
- 値の順序
- インデックス付けされた値のコンパクトさ
値がa
の場合 およびb
、a
と言うことができます b
の前に来る 、辞書式順序。ドキュメントがある場合{a: 2, b: 5}
および{b: 4, a: 3}
、一般的なクエリを満たすこれらのドキュメントの単一の順序はありません。たとえば、すべてのa
が必要な場合 順序付けされた値は、2, 3
を期待する可能性があります 、ただし、b
が必要な場合 期待できる値4, 5
-ドキュメントの順序を逆にする必要があります。
データベースがインデックスをディスクに保存する場合、値はインデックス順で保存されます。 (特定のインデックスに当てはまるものは何でも、たとえば照合はこれに影響します)。一般に、コレクションドキュメント全体に使用できる単一の順序はないため、コレクションドキュメントは順序付けされていません。
インデックスでクエリを実行する場合、インデックス内のデータが並べ替えられるため、検索対象の値を取得し、基本的にインデックスを使用してバイナリ検索を実行します。
インデックスを使用する2つ目の理由は、コレクションをスキャンしている場合、ドキュメントごとに、通常、ドキュメント全体をディスクから取得してスキップする必要があるためです。 100 GBのコレクションがあり、スキャンを実行している場合は、100GBを超えるデータをスキップする必要がある場合があります。同じコレクションの一部のフィールドに100MBのインデックスがあり(インデックスはそのフィールドの値のみを格納し、ドキュメント全体のデータの価値は格納しないため)、データベースが完全なインデックススキャンを実行する場合、100MBのインデックスをトラバースするだけで済みます。データ。
さて、値の不足の保存についての質問に インデックスで。
インデックスの観点からは、異なるドキュメントの「値の欠如」は同じ値です。すべての値が同一である場合、バイナリ検索を実行する機能が失われます。したがって、その「価値のない」ドキュメントを探している場合、インデックスはコレクション内の価値のないすべてのドキュメントを返します。その後、他の条件でフィルタリングするために、とにかくそれらをスキャンする必要があります。持ってる。これは一般的に悪い選択性を生み出すため、データベースはインデックスを気にせず、そもそもコレクションスキャンを実行します。
また、値を持たないフィールドではなく、クエリから他のフィールドが必要になる可能性があります。したがって、今度は、インデックスに完全なドキュメントを保存して、コンパクトさのアイデアを打ち負かす必要があります。