2014-10-22 55 views
0

我看起來像這樣的文件:mongodb使用什麼索引?

{ 
    { 
     "_id": ObjectId("5444fc67931f8b040eeca671"), 
     "meta": { 
     "SessionID": "45", 
     "configVersion": "1", 
     "DeviceID": "55", 
     "parentObjectID": "55", 
     "nodeClass": "79", 
     "dnProperty": "16" 
     }, 
     "cfg": { 
     "Name": "test" 
     } 
    } 

的名稱和數據只是爲了測試個大氣壓。但我在數據庫中共有2500萬個文件。我在這個find()中使用find()來獲取特定的文檔。在這種情況下,我使用四個參數,dnProperty,nodeClass,DeviceID和configVersion,它們都不是唯一的。

Atm。我的索引設置很簡單:

ensureIndex([["nodeClass", 1],["DeviceID", 1],["configVersion", 1], ["dnProperty",1]]) 

換句話說我有四個參數的索引。如果您執行的搜索沒有找到任何文檔,我仍然遇到很多問題。在我的例子中,所有的「數據」在1-100之間是隨機的,所以如果我使用其中一個值大於100的find(),則需要30-180秒的任何時間來執行搜索,它也使用我所有的8GB RAM,那麼由於沒有RAM,計算機變得非常慢。

什麼是更好的索引?我使用索引是否正確?我是否只需要更多的內存,因爲它會將數據庫的「全部」放入其工作內存中?你會推薦另一個數據庫(mongo除外)來處理這個更好嗎?

對不起,有很多問題我希望它們足夠短,你可以給我一個答案。

+0

您能向我們展示您的慢查詢嗎? – joao 2014-10-22 07:45:37

+0

2500萬個文件很多。你可以考慮這些事情:使用多個集合來分割數據;使用數據集(如google bigquery)其快速和類似於SQL。 – 2014-10-22 07:46:10

回答

1

MongoDB使用內存映射文件,這意味着您的數據和索引副本存儲在RAM中,並且每當有查詢時它就從RAM本身獲取它。在當前場景中,查詢速度較慢,因爲您的數據+索引大小太大以至於無法放入RAM中,因此將會有大量I/O活動從磁盤獲取數據,這是瓶頸。

拆分解決這個問題的幫助,因爲如果你的分區/分片間的資料,例如,然後5臺機器,你將有8GB * 5 = 40GB的RAM,可容納你的(數據集+指標=工作集)的RAM本身和I/O開銷將會減少,從而提高性能。

因此,在這種情況下,您的索引不會有助於提高超出特定點的性能,您將需要在多臺機器上分割您的數據。分片將趨於增加讀取以及線性寫入吞吐量。 Sharding in MongoDB