2011-02-06 94 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

您的查詢實際上是使用索引,如解釋輸出中的遊標類型(「BtreeCursor evs.s_1」)所示。如果你沒有使用索引,它將是「BasicCursor」。

從輸入數據看,evs.s可能不是一個非常有效的索引鍵。如果evs.s的所有值都是1或0,那麼您的索引將始終打大量匹配。

我的猜測是您的查詢沒有執行全表掃描,但實際上有很多記錄的值在您的索引中爲evs.s = 0。 。

你可能會比較

db.visits.find的輸出({evs.s:0})計數();

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

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

來驗證這一點。

有幾件事情可以做,以加快這:

1)您可以使用具有多個不同的值不同的索引。這將減少每個查詢的搜索空間。

2)您可以爲查詢添加限制語句。一旦發現限制文件,這將停止掃描索引。

+0

Ahhhhh是的你的權利,沒有真正的方法來有效地索引10,000 0的。限制大大加快查詢速度,謝謝! – Lerchmo 2011-02-06 16:11:13

0

「光標」: 「BtreeCursor evs.s_1」

意味着索引使用