2013-02-12 17 views
2

我有一個相當有趣的任務。但我不知道如何用一個詞來調用它來搜索相關主題。即使這個話題標題也許並不能反映我需要的東西。所以,如果有人有更好的頭銜 - 歡迎。比較錶行,大數據量

我會盡力解釋我的問題。

我在MySQL數據庫表中有大約100,000行。我需要從表格中「比較」條目。

「比較」 並不僅僅意味着等於。有一個計算比較級別的算法。我有每個表列的權重係數。意思是說,如果條目1的列1等於條目2的列2,那麼我給5對這個對。等等每列。

要做到這一點的最直接的方法 - 爲每對條目應用計算規則。我爲什麼害怕這個? 100,000個條目意味着大約50億個「比較」操作。當然,我可以根據需要計算這個,並將結果存儲在緩存中的某處。但我相信最明顯的方式並不是最有效的。

所以,我的第一個問題是:有沒有其他更好的辦法才達到除了蠻力我的目標是什麼?

我的第二個問題是關於工具,它更適合計算

  1. 應用語言是PHP。因此,我需要加載到整個內存表 並迭代數據。
  2. 在MySQL中創建存儲過程。
  3. 使用MongoDB的聚合框架或MapReduce。

最少所有的我喜歡的第一種方式。最重要的 - 最後一個。

我正在尋找從誰在這種類型的案件經驗的人任何建議或忠告。

因爲,我不知道該怎麼問谷歌的幫助,任何鏈接將不勝感激。

UPDATE:

計算規則是有點複雜然後我描述...

表具有一組相關的列,其在作爲組(由一個一次而不是一個要使用的)。 假設:

table具有領域,比方說,tag_1tag_2,..,tag_nrow_1row_2 - table中的條目。

規則(僞代碼):

if(row_1.tag_1==row_2.tag_1) 
{ 
    // gives 10 points 
} 
elseif(row_1.tag_1 is in row_2.tags && row_1.tag_1!=row_2.tag_1) 
{ 
    // gives 5 points 
} 
.... 
// and so on 

基本上,我需要檢查找到兩個陣列的交叉點。如果不是空的 - 給出分數。如果兩行中的標籤的索引匹配,則給出附加點。

我想知道,如何使用存儲過程語言來完成這項工作?因爲使用任何編程語言都可以輕鬆完成。

如果存儲過程可以做到這一點,那麼這是我的選擇。

回答

2

如果你有一個靜態表,那麼只要您將結果存儲在某處(可能回到數據庫中),那麼選擇它並沒有什麼不同。

如果您的數據正在改變,那麼您需要將每個新行與所有行進行比較,這實際上是一個全表掃描。這可能是最好在數據庫中完成的。如果數據適合內存(並且500,000行應該適合內存),那麼(2)在等效硬件上可能會快於(3)。 「等效硬件」是一個非常重要的考慮因素。

在大多數情況下,我會選擇(2)。這聽起來像是這樣的查詢:

select t.id, t2.id, 
     ((case when t1.col1 = t2.col1 then 5 else 0 end) + 
     (case when t2.col2 = t2.col2 then 7 else 0 end) + 
     . . . 
     ) 
from t cross join t2 

如果你更熟悉map-reduce,那麼你可能會發現它更容易編程。我知道這兩種語言,並喜歡SQL這樣的東西。

+0

謝謝你的回答。我也傾向於這一點,但我沒有告訴你所有的真相:)看到我更新的職位。 – 2013-02-12 14:18:28

+0

@RuslanPolutsygan。 。 。您仍然可以使用'case'語句實現這些規則:'當(t2.tag1,。。t2.tagn)中的t1.tag1和。 。 .'。 – 2013-02-12 14:26:44

+0

感謝您的幫助。 – 2013-02-12 16:54:11

1

你能不能做這樣的事情:

UPDATE table SET points = points+5 WHERE column1 = column2 

如果你有太多檢查特定的值,你可以嘗試這樣的事:

UPDATE table SET points = points+5 WHERE column1 = 'somevalue' AND column2 = 'somevalue' 
+0

如果您的答案中的「表格」是我在我的問題中討論的表格(用於比較的數據存儲在該表格中),那麼它將無法工作。如果我在'table'中添加'points'字段,那麼它就沒有任何意義,因爲它必須依賴兩個表格行。我需要比較表中的行,而不是行中的列。 無論如何。 – 2013-02-12 13:30:55

+0

然後,你必須做它行排。我會創建一個存儲過程,利用數據庫的強大功能,而不必使用其他語言寫任何內容。 – nhalink 2013-02-12 13:38:45

+0

是的,我也傾向於這樣做。謝謝 – 2013-02-12 13:48:27