2011-02-06 9 views
0

私はサイト使用イベントを(訪問者)のサブオブジェクトに記録しています。MongoDBのサブオブジェクトを照会してもインデックスが使用されていません

{ "_id" : ObjectId("4d4c695794b332a0740009bd"), "evs" : [ 
    { 
      "ev" : "Visit Home Page", 
      "d" : 1, 
      "s" : 1 
    }, 
    { 
      "ev" : "Buy Product", 
      "d" : "110.10", 
      "upc" : 1234, 
      "s" : 1 
    }, 
    { 
      "ev" : "Sign up to newsletter", 
      "d" : "1", 
      "s" : 1 
    } 
]} 

私は「evs.s」に関する指標がありますが、私はevs.s上で検索した場合、インデックスが使用されていない:ここでのデータ構造の基本的な例がある

db.visitors.find({'evs.s':0}).explain() 
{ 
    "cursor" : "BtreeCursor evs.s_1", 
    "nscanned" : 33361, 
    "nscannedObjects" : 33361, 
    "n" : 33361, 
    "millis" : 311, 
    "nYields" : 105, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
      "evs.s" : [ 
        [ 
          0, 
          0 
        ] 
      ] 
    } 
} 

そのクエリは311ミリ秒かかり、すべてのオブジェクトをスキャンします。ここ

インデックスである:db.visitors.getIndexes()

{ 
    "ns" : "tracking.visitors", 
    "unique" : false, 
    "key" : { 
    "evs.s" : 1 
    }, 
    "name" : "evs.s_1", 
    "v" : 0 
} 

答えて

2

実際には、Explain出力のカーソル・タイプ( "BtreeCursor evs.s_1")に示されているように、索引が使用されています。インデックスを使用していない場合は、 "BasicCursor"になります。

あなたの入力データからは、非常に効率的なインデックス作成の鍵ではない可能性があります。 evs.sのすべての値が1または0の場合、索引は常に多数の一致をヒットします。

私の推測では、あなたのクエリはフルテーブルスキャンを実行していないが、実際にはそのインデックスにevs.s = 0の値を持つレコードがたくさんあるということです。

あなたは({evs.s:0})

db.visits.findの出力を比較することがあります。(カウント)。

db.visits.find({evs.s:1})。count();

db.visits.find()。count();

これを確認します。

1)あなたはより多くの異なる値を持つ別のインデックスを使用することができます。

は、あなたがこれをスピードアップするために行うことができますいくつかあります。これにより、各クエリの検索スペースが小さくなります。

2)制限ステートメントをクエリに追加できます。制限文書が見つかると、索引のスキャンが停止されます。

+0

はい、あなたの権利は、効率的に10,000のインデックスを作成する実際の方法ではありません。 Limitはクエリを大量に高速化します。ありがとう! – Lerchmo

0

"カーソル": "BtreeCursorはevs.s_1"

インデックス使用されることを意味します。

関連する問題