我有一个非常有趣的任务。但我不知道如何用一个词来称呼它以搜索相关主题。即使这个主题标题也可能无法反映我的需求。所以,如果有人有更好的头衔 - 欢迎。
我会尝试解释我的问题。
我在MySQL数据库表中有大约100,000行。我需要“比较”表中的条目。
“比较”并不仅仅意味着相等。有一种计算比较级别的算法。我有每个表格列的权重系数。意味着如果条目#1的column1等于条目#2的column2,那么我给5对这个对。等等每列。
最直接的方法 - 为每两个条目应用计算规则。为什么我害怕这个? 100,000个条目意味着大约50亿“比较”操作。当然,我可以按需计算 并将结果存储在缓存中的某处。但我认为最明显的方式并不是最有效的方式。
所以,我的第一个问题是:除了暴力之外还有其他更好的方法来实现我的目标吗?
我的第二个问题与工具有关,该工具更适合计算。
至少我喜欢第一种方式。最重要的是 - 最后一个。
我正在寻找有此类案件经验的人的任何建议或建议。
由于,我不知道如何向谷歌寻求帮助,任何链接都将不胜感激。
更新
计算规则比我描述的要复杂一点......
表有一组相关的列,它们将一次用作组(不是一个一个)。 我们假设:
table
包含字段,例如tag_1
,tag_2
,..,tag_n
。
row_1
和row_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
基本上,我需要检查找到两个数组的交集。如果它不是空的 - 给出了分数。如果两行中的标记索引匹配,则给出附加点。
我想知道,如何使用存储过程语言完成此操作?因为使用任何编程语言都可以轻松完成。
如果存储过程可以执行此操作,那么这是我的选择。
答案 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'