昨天我有一个question人们建议我使用 Levenshtein 方法。这是一个缓慢的查询?也许我可以用别的东西?
答案 0 :(得分:3)
答案 1 :(得分:1)
这取决于您的数据集。
我发现只要比较相似长度的字符串,我就可以大大加快速度。
您的字符串长度的相似程度取决于您的数据。
这里有一篇关于这个主题的文章:http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up
答案 2 :(得分: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;