2011-07-26 77 views
1

我們正試圖從mysql移動到mongodb。 MySQL的結構是 id_src INT id_dest INT 唯一密鑰:id_src,id_dest從Mysql切換到MongoDB 200百萬行

它們是在MySQL

數據爲例約200百萬行: {id_src,id_dest} {1,2} {1, 3} {1,10} {2,3} {2,10} {4,3}

我們需要檢索數據: {id_dest,count} {3,3} {10,2} {2 ,1}

我開始重構mongodb中的mysql結構。 插入性能非常好(非常好):大約1小時插入2億行。

但我需要使用map reduce來獲取組。地圖縮短大約需要1個小時。

所以我試圖創建一個其他MongoDB的結構: {id_dest,{id_src1,id_src2}}

每個文件可以有十萬id_src的。

這裏是我的insert.php代碼

$res=mysql_unbuffered_query("select * from ids limit 10000100"); 
while ($tab=mysql_fetch_array($res)) { 
$collection->update(array('_id'=>(int)$tab['id_dest']),array('$push' => array('src'=>(int)$tab['id_src'])),array("upsert" => true)); 
} 

但在這種情況下,表現都非常糟糕,只有每秒幾更新。

我做錯了什麼?

+1

如果1h對於200m行是「巨大的」,那麼讓我問你:在MySQL中插入200m行需要多長時間? –

+1

當我說「巨大」時,我說「非常好」。但我的問題是地圖縮短時間來獲得「羣體」這是可以接受的,但對我們來說並不完美。我想知道一個使用mongodb特性(多值字段)的新文檔模型是否不僅僅是重現mysql數據結構。 – benfromaix

+0

我明白了。讓我們等待一個好的答案,然後:-) –

回答

6

首先,Map/Reduce不是專爲實時分析而設計的。此外,MongoDB目前僅限於M/R的一個內核,這將使事情進一步放緩。因此,如果您打算使用M/R來獲取數據,它將不會是「實時」,而是每X分鐘(或幾小時)更新一次。

這裏有兩個有效途徑:

  1. 增量M/R
  2. 實時計數器

選項#1:增量M/R

對於本選項爲所有數據運行一次M/R。然後,繼續前進,您只能在修改的數據上運行M/R。如果你現在有200M文件,你可能會有210M文件(這意味着M/R變得更慢)。但是,如果您只需要運行新的/更改的文檔,那麼它應該花費不到1個小時。

查看文檔here中的reduce輸出選項。

同樣的前提是,您只需將M/R相關數據和系統「重新減少」到現有數據中。這樣你就可以得到一個「增量」的M/R。

選項#2:實時計數器

在這種方法中,你有兩個集合:一個用於數據,另一個用於「摘要」的結果。當你插入數據時,你也會在摘要上做一個增量。

假設你有這樣的數據:

Main Collection 
{src: 1, dest: 2} 
{src: 1, dest: 3} 
{src: 1, dest: 10} 
{src: 2, dest: 3} 
{src: 2, dest: 10} 
{src: 4, dest: 3} 

Summary Collection 
{dest: 3, count: 3} 
{dest: 10, count: 2} 
{dest: 2, count: 1} 

,您會收到一條新的數據{src: 5, dest: 2}的。你會做兩個更新:

db.main.insert({src: 5, dest: 2}); 
db.summary.update({dest: 2}, { $inc : { count: 1 } }, true); // upsert true 

這是你的新的數據:

Main Collection 
{src: 1, dest: 2} 
... 
{src: 4, dest: 3} 
{src: 5, dest: 2} 

Summary Collection 
{dest: 3, count: 3} 
{dest: 10, count: 2} 
{dest: 2, count: 2} 

你會發現,我們已經更新了總結:{dest: 2, count: 2}

很顯然,這裏有一些折衷。你需要更多的更新/插入(2倍),但你得到實時計數器。現在,MongoDB中沒有事務處理,因此您必須決定確保兩個更新都發生的策略。有很多方法可以做到這一點,我不能在這裏進入(參見消息隊列的一種方法)。

+0

我實施了您在過去幾個小時內建議的實時解決方案。我只是得到了很好的結果。更新摘要集合非常快,幾乎不會降低性能,並且我得到實時更新計數器。謝謝 ! – benfromaix