2011-12-02 61 views
1

考慮一個集合中的數據結構如下:

{ 
_id : ObjectId("4ec6c015482c4c8302000001"), 
uid : ObjectId("4ec6c015482c4c8302003233") //reference to user's Object ID 
someValue : some json object, 
} 

所述收集將在UID分片。

在這兩種情況下,哪種讀取方式更有效?

選項A)

引用存儲到每個數據結構中的用戶對象,並執行該查詢:

db.collection.find({_id: {$in: ids}} 

選項B)

上創建流體的索引和查詢是這樣的:

db.collection.find({uid : ObjectId("4ec6c015482c4c8302003233")}) 

每個結果集都會包含0-20個數據結構從收集。

概括:它會更快找到()20點特定的ID或匹配索引ID值的所有對象(結果集也是20)

回答

2

選項(B)是更好的和直接的:

我)你並不需要存儲_ids的引用seperately。

ii)如果uid上存在索引,那麼您的查詢將會很快,無需優化。

iii)其他操作如sortlimit,findOne將以基本語法工作。 使用選項(A),您將必須始終獲取整個數據並對其執行操作。

0

如果選擇了選項A),並沒有一個指數,選項B)將更加高效。如果你將所有的數據完整地存儲在內存中,即使是困難的,使用B)也是如此(因爲應用程序只需要比較一個值而不是幾個值)。

+0

_id具有一個自動創建的索引,除非集合被上限,否則您不能刪除該索引。 –

2

在uid上創建一個索引,答案就是這樣。

 uid V.S. _id _id _id 
     /|\   | | | 
    doc doc doc  doc doc doc 

您推入查詢的_ids越多,對_id的檢查越多,這意味着額外的I/O。和獲取文檔的時間是一樣的。

+0

圖形的+1 –

相關問題