2013-02-12 40 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