比较表行,大数据量

时间:2013-02-12 11:16:46

标签: php mysql mongodb

我有一个非常有趣的任务。但我不知道如何用一个词来称呼它以搜索相关主题。即使这个主题标题也可能无法反映我的需求。所以,如果有人有更好的头衔 - 欢迎。

我会尝试解释我的问题。

我在MySQL数据库表中有大约100,000行。我需要“比较”表中的条目。

“比较”并不仅仅意味着相等。有一种计算比较级别的算法。我有每个表格列的权重系数。意味着如果条目#1的column1等于条目#2的column2,那么我给5对这个对。等等每列。

最直接的方法 - 为每两个条目应用计算规则。为什么我害怕这个? 100,000个条目意味着大约50亿“比较”操作。当然,我可以按需计算 并将结果存储在缓存中的某处。但我认为最明显的方式并不是最有效的方式。

所以,我的第一个问题是:除了暴力之外还有其他更好的方法来实现我的目标吗?

我的第二个问题与工具有关,该工具更适合计算

  1. 应用程序语言是PHP。因此,我需要整个加载到内存中 表并迭代数据。
  2. 在MySQL中创建存储过程。
  3. 使用MongoDB的聚合框架或MapReduce。
  4. 至少我喜欢第一种方式。最重要的是 - 最后一个。

    我正在寻找有此类案件经验的人的任何建议或建议。

    由于,我不知道如何向谷歌寻求帮助,任何链接都将不胜感激。

    更新

    计算规则比我描述的要复杂一点......

    表有一组相关的列,它们将一次用作组(不是一个一个)。 我们假设:

    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 个答案:

答案 0 :(得分: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更加满意,那么您可能会发现在那里编码更容易。我知道这两种语言,并喜欢这样的东西。

答案 1 :(得分:1)

你不能做这样的事情:

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

如果您也检查了特定值,可以尝试这样的事情:

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