2

インデックスがある場合

page_type, our_id, date

クエリを実行すると、

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}})

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}}).explain()

が省略された場合our_id、またはdate省略された場合でも、explain() の出力に次のような内容でインデックスを使用できます。

"our_id" : [
    [
        {
            "$minElement" : 1
        },
        {
            "$maxElement" : 1
        }
    ]
],

と の両方our_iddate省略した場合でも、インデックスは引き続き使用できます。

ただし、page_typeを省略した場合は、インデックスを使用できません ( をexplain()参照)。では、MongoDB では、インデックスの一部が数値や日付などのシーケンスの一部である場合、クエリ時に省略できるというのは本当ですか? これはリレーショナル DB にも当てはまりますか?そのインデックスがこれらの 3 つのフィールドに基づいている場合、厳密には 3 つのフィールドに基づいている可能性があると思います。

4

1 に答える 1

1

これらは B ツリー インデックスであるため、関係する列のプレフィックス サブセットに使用できます。先頭の列がない場合、インデックス レンジ スキャン (B ツリー インデックスが主に使用される操作) は実行できなくなります。インデックスを使用する方法は他にもあるかもしれませんが (たとえば、Oracle には高速なフル スキャンとスキップ スキャンがあります)、通常、インデックスは使用されません。

この推論は、リレーショナル DB かどうかに関係なく、B ツリー インデックスを使用するすべてのものに当てはまります。

繰り返しますが、これは列の型には依存しませんが、インデックス内の列の順序に依存します。先頭の列が必要です (この場合、page_type が必要です)。page_type のないクエリが多数ある場合は、最後の列として page_type を使用してインデックスを再作成することを検討してください (もちろん、他のクエリにも悪影響を与える可能性があります)。一般に、インデックスを設計する前に、実行するクエリの種類を知る必要があります。

于 2010-09-21T05:45:17.780 に答える