php 在MySQL中Levenshtein慢吗?

j2cgzkjk  于 2023-09-29  发布在  PHP
关注(0)|答案(3)|浏览(129)

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

cbwuti44

cbwuti441#

您可以使用BENCHMARK函数来测试性能:

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

也许可以使用与您的用例类似的不同字符串来测试它。

pkmbmrz7

pkmbmrz72#

这取决于你的数据集。
我发现我可以通过比较长度相似的字符串来大大加快速度。
字符串的长度需要有多相似取决于您的数据。
这里有一篇关于这个主题的文章:http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up
存档链接:https://web.archive.org/web/20160415095337/http://kerbtier.ch/2008/12/30/levenshtein-to-slow-how-to-speed-it-up

qzwqbdag

qzwqbdag3#

如果你想让它表现良好,那么规范化你的模式
问题是,为了确定其他数据的相似程度,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;

相关问题