2013-07-18 21 views
0

與同事進行架構討論後,我們需要爲此找到答案。給定一組百萬個數據點,看起來像:爲讀取速度進行優化時的索引與規範化

data = 
[{ 
    "v" : 1.44, 
    "tags" : { 
     "account" : { 
      "v" : "1055", 
      "name" : "Circle K" 
     } 
     "region" : "IL-East" 
    } 
}, { 
    "v" : 2.25, 
    "tags" : { 
     "account" : { 
      "v" : "1055", 
      "name" : "Circle K" 
     } 
     "region" : "IL-West" 
    } 
}] 

而且,我們需要在標籤集合中的字段查詢(例如在account.name ==「圓K」),會不會有任何速度效益帳戶領域標準化這樣:

accounts = 
[{ 
    _id : 507f1f77bcf86cd799439011, 
    v: "1055", 
    name : "Circle K" 
}] 

data = 
[{ 
    "v" : 1.44, 
    "tags" : { 
     "account" : 507f1f77bcf86cd799439011 
     "region" : "IL-East" 
    } 
}, { 
    "v" : 2.25, 
    "tags" : { 
     "account" : 507f1f77bcf86cd799439011 
     "region" : "IL-West" 
    } 
}] 

我懷疑我將不得不建立2分貝的,這和剛纔看到了什麼速度樣子。問題是,在查詢BSON ID和字符串時,mongo會更好嗎?有問題的數據庫大約是1:10寫與讀。

+0

鑑於B樹存儲密鑰的方式,我不會懷疑兩者之間存在重要差異。 – WiredPrairie

+0

@WiredPrairie我也懷疑;我們需要最大限度地提高性能,所以我將不得不同時測試 - 實際上我認爲規格化版本可能會比較慢,因爲它是兩個查詢,而不是一個 – jcollum

+0

肯定,執行兩個查詢會稍微慢一些。我只在你的'_id'問題上發表評論。 – WiredPrairie

回答

1

這裏最重要的是確保你的工作集有足夠的內存。這包括「tags.account.name」索引的空間和預期的查詢結果集。

至於密鑰大小。你使用上面的ObjectID-as-string,你不應該這樣做。留下真正的ObjectIDs,因爲它們的尺寸比較小。如果你真的有很多小文件,那麼你甚至可以考慮縮短你的域名。

+0

「你使用上面的ObjectID-as-string,你不應該這麼做」 - 這樣做是因爲我不知道我的頭頂是那些在JSON中看起來像什麼 – jcollum

+0

我同意,你需要確保足夠的MongoDB服務器上的RAM數量,以及'tags.account.name'索引的存在,這些都是快速查找所需要的。 –