我有一个很有趣的任务。但我不知道如何用一个词来称呼它,以便搜索相关主题。即使是这个题目也不能反映我的需要。所以,如果有人有更好的头衔-欢迎。
我会尽力解释我的问题。
mysql db表中有大约100000行。我需要“比较”表中的条目。
“比较”并不意味着平等。有一种计算比较级的算法。我有每个表列的权重系数。也就是说,如果条目1的column1等于条目2的column2,那么我给这对加5分。每一列都是如此。
要做到这一点,最直接的方法是对每两个条目应用计算规则。我为什么害怕这个?10万个条目意味着大约50亿个“比较”操作。当然,我可以按需计算结果并将结果存储在缓存中。但我相信最明显的方法并不是最有效的。
所以,我的第一个问题是:除了暴力,还有其他更好的方法来实现我的目标吗?
我的第二个问题是有关的工具,这是更好的计算。
应用程序语言是php。因此,我需要把整个
表并对数据进行迭代。
在mysql中创建存储过程。
使用MongoDB的聚合框架或MapReduce。
我最不喜欢第一条路。最重要的-最后。
我在找有这类经历的人的建议或建议。
因为,我不知道如何向谷歌寻求帮助,任何链接都将不胜感激。
更新:
计算规则比我描述的要复杂一些…
表具有一组相关列,这些列将立即用作组(而不是逐个使用)。
假设:
table有字段,例如,tag_1tag_2,…,tag_n
row_1row_2中的条目。
规则(伪代码):

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

基本上,我需要检查两个数组的交集。如果不是空的,就给分。如果两行中标记的索引匹配,则给出附加点。
我想知道,如何使用存储过程语言来实现这一点?因为使用任何编程语言都可以很容易地完成。
如果存储过程可以做到这一点,那就是我的选择。

最佳答案

如果您有一个静态表,那么只要您将结果存储在某个地方(可能是存储在数据库中),选择哪一个表并没有什么区别。
如果数据正在更改,则需要将每一新行与所有行进行比较,这实际上是一次完整的表扫描。最好在数据库中完成。
如果数据适合内存(500000行应该适合内存),那么(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。

关于php - 比较表行,大数据量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14831266/

10-11 02:54
查看更多