2010-08-09 108 views
1

昨天我有一个question人们建议我用Levenshtein的方法。这是一个缓慢的查询?也许我可以使用别的东西?Levenshtein在MySQL中很慢吗?

+0

我想帮助,但问题是非常广阔的。专注于特定的作品会让讨论和提供建议更容易。 – 2010-09-13 19:22:45

+6

如果您有其他问题,请提出一个新问题。不要完全改变你现有的一个。 – Greg 2010-09-13 20:29:43

+0

没有关于它的规则,所以你不能编辑我的帖子。 – 2010-09-14 15:17:38

回答

3

可以使用BENCHMARK功能来测试性能:

SELECT BENCHMARK(10000, LEVENSHTEIN('abc', 'abd')); 

也许类似于你的使用情况不同的字符串进行测试。

+1

LEVENSHTEIN不是一个集成的MySQL函数。它是用户定义的功能。你需要用C编写它。阅读提供的链接到另一个相关的StackOverflow问题。 – 2010-08-09 13:40:32

0

如果你想要它的表现不错,那么规范你的模式

问题是,为了确定其他数据的相似程度,DBMS必须加载该数据并将其与数据进行比较。所以它必须读取表格中的每一行(除了当前行)以找到“相似”值。它不能使用索引来查找接近数据的数据。

如果,另一方面,你用这样的模式:

CREATE TABLE member (
    member_id  INT(11), 
    member_data CLOB, 
    PRIMARY KEY (member_id)); 

CREATE TABLE about_member (
    member_id  INT(11), 
    metric   VARCHAR(10), 
    value   MEDIUMINT(9), 
    PRIMARY KEY (member_id, metric), 
    KEY by_value (metric, value, member_id)); 

请注意,您about_member(1-1-2-2-1)字符串应该被实现为单独的行,例如

member_id  metric  value 
1234   lost  2 
1234   won   3 
1234   drawn  1 
1234   handicap 9 

然后,您可以有效地使用索引,例如使用以下查询。

SELECT compare.member_id, SUM(ABS(compare.value-datum.value)) AS difference 
FROM about_member compare, about_member datum 
WHERE datum.member_id=$MEMBER_TO_COMPARE 
AND compare.member_id<>datum.member_id 
AND compare.metric=datum.metric 
AND compare.metric BETWEEN (datum.metric-1) AND (datum.metric+1) /* tweak here */ 
GROUP BY compare.member_id;