2012-12-15 19 views
10

在查詢mongo數據庫時,是否在排除文檔中幾乎所有數據的開銷很大?MongoDB預測的效率如何?

例如,在這裏我只想FIELD1場2,對於具有文檔結構集合的情況:

{ 
    "field1" : 1 
    "field2" : true 
    "field3" : ["big","array",...] 
    "field4" : ["another","big","array",...] 
} 

我會更多地受益於:

  1. 與此集合一起創建一個單獨的集合,其中僅包含字段1和字段2的 ,或者
  2. 使用.f IND()與包含/排除的原始文件參數

注:保存相同數據兩次的低效率是不是我的關心不亞於查詢數據

許多感謝的效率!

+0

這些文件有多大? –

+0

@AsyaKamsky每個大約0.3MB,field1和field2結合<1kB。文件大小會有影響嗎? – Ash

+0

它使文檔佔用多少內存有所不同,因爲當查詢文檔時,即使只需要某些特定字段,整個文檔也可能會以RAM結尾。你想要的兩個領域總是前兩個領域? –

回答

5

投影有點類似於在SQL中顯式使用列名,所以似乎有點反直覺問是否返回較少量的數據會導致返回大量數據(完整文檔)的開銷。所以你必須找到文檔(取決於你的.find()它可能快或慢),但只返回文檔的前兩個字段而不是所有的字段(完整的文檔)會使它更快地更快地更新不慢。

擁有第二個集合可能只有在您關心您的集合到RAM中時纔會受益。如果重複集合中的文檔要小得多,那麼它們大概可以放入少量的總RAM中,從而減少了需要從磁盤交換頁面的機會。但是,如果你正在寫這個集合以及原始集合,那麼你必須在RAM中擁有比只有原始集合更多的數據。

所以雖然複雜的細節可能取決於您的個人設置,但一般的答案可能是2.您將從使用投影獲得更多益處,並且只會返回所需的兩個字段。

+0

感謝您提供非常詳細的答案!還有一個問題,如果我索引field1和field2並在這兩個字段上查詢集合的一個子集,這隻會將這個子集的數據加載到RAM中? 對我缺乏數據庫知識表示歉意。 – Ash

+1

只有包含您需要的文檔的頁面纔會被加載到RAM中。當然,索引也會在RAM中。 –