2010-10-03 65 views
2

我從昨天開始玩MongoDB,絕對喜歡它。我正在嘗試導入大量數據(20億行)並對其進行索引,但似乎沒有使用我的系統擁有的8個內核,並且導入速度正常(60000記錄/秒)。我只能想象在這個集合中索引兩列可能需要多長時間。有沒有MondoDB類型的數據庫利用CPU的多核特性?是否有任何多核開發NoSQL系統?

+0

我不認爲你可以高效地處理來自多個內核的數據插入。 – zneak 2010-10-03 01:06:19

+1

@zneak:我實際上正在考慮將數據插入多個集合(表格)。只是我不確定這樣分手會有好處。我的意思是,我不會在大表上添加索引,而是創建許多小表,然後在每個表上創建一個索引。然後從前端查詢所有表格以獲取所需的值。你對這種方法有什麼建議嗎? – Legend 2010-10-03 01:12:38

+1

我不是NoSQL專家。我所知道的是,你不能安全地修改多線程中的數據而不鎖定它,因此我的評論。 :/抱歉,我無法幫助。 (不過,我也知道你應該填充你的集合,然後創建索引,否則,你會浪費很多時間在每個插入時重新索引數據。) – zneak 2010-10-03 04:41:13

回答

9

如果MongoDB有一個致命弱點,那就是它只支持單線程寫和單線程map-reduce。

與往常一樣,這裏存在取捨。單線程寫入是避免鎖定問題和最小化開銷的最簡單方法。以同樣的方式,多線程映射縮減是鎖定數據的好方法。因此,生產系統上的單線程映射減少可能更容易和更安全。

但是,你不是沒有工具在這裏。 MongoDB將爲每個實例提供一個寫入線程。所以,如果你分片MongoDB,那麼你會得到每個分片的一個寫線程。

如果你想要20億行上的多個索引,你會想看看分片。這裏有一些快速數學:MongoID是12個字節。 MongoID的索引將爲2B * 12字節= 22GB +。如果你現在想要添加兩個索引(甚至只是兩個4字節整數),我們每個都談論7.5GB。

所以在2B行,你說的是在索引中有超過37GB(最小值爲)。在大多數8核心服務器上,這意味着你甚至無法將索引保存在內存中,更不用說任何數據了。

所以如果你想在這裏認真的表現,你會想開始看分片。只是基於一般數字。 FWIW,MySQL不會擅長處理2B文檔。有了這麼多的數據,你真的想要多個服務器來跟上負載。

+0

我想分拆是這次走的唯一途徑。謝謝你的建議。我在MySQL和MongoDB中都有索引。將使用第一個完成的:)另外一個很好的基準測試練習...... – Legend 2010-10-03 06:32:35

相關問題