Php 在MySQL中使用levenshtein和soundex算法进行搜索时提高性能

Php 在MySQL中使用levenshtein和soundex算法进行搜索时提高性能,php,mysql,performance,levenshtein-distance,soundex,Php,Mysql,Performance,Levenshtein Distance,Soundex,我们正在尝试将数据从Excel上传到数据库。在上传之前,我们希望在与我们的数据库进行比较的同时预览匹配状态计数(例如:无匹配、相似匹配、精确匹配)的数据 下面的查询需要3分钟的时间从数据库中获取100行的信息。我们将有一个案例,用户可以上传超过5K行的数据。请告知我们您对改进以下查询性能的建议 select IF( count(distinct ID) <= 0, ( select case when count(ID) > 0 then 'Similar M

我们正在尝试将数据从Excel上传到数据库。在上传之前,我们希望在与我们的数据库进行比较的同时预览匹配状态计数(例如:无匹配、相似匹配、精确匹配)的数据

下面的查询需要3分钟的时间从数据库中获取100行的信息。我们将有一个案例,用户可以上传超过5K行的数据。请告知我们您对改进以下查询性能的建议

select IF(
    count(distinct ID) <= 0, (
        select case when count(ID) > 0 then 'Similar Match' else 'No Match' end as MatchType from masterTable where (
            soundex(BarCode) like soundex('12069B0') or soundex(ProductName) like soundex('FreezerZX')
        ) and (
            levenshtein(BarCode,'12069B0') < 3 or (levenshtein(ProductName,'FreezerZX') < 3)
        )
    ), 
    'Exact Match'
) as MatchType from masterTable where BarCode= '12069B0' and ProductName= 'FreezerZX';
选择“如果”(
计数(不同ID)0,然后“相似匹配”或“不匹配”作为主表中的匹配类型结束,其中(
类似soundex('12069B0')的soundex(条形码)或类似soundex('CookerZX')的soundex(产品名称)
)及(
levenshtein(条形码,'12069B0')<3或(levenshtein(产品名,'FreezerZX')<3)
)
), 
“精确匹配”
)作为masterTable中的MatchType,其中条形码='12069B0'和产品名称='CookerZX';

如果没有“相似匹配”的简单算法,我建议您放弃使用计算机完成整个任务。人类的大脑在相似性测试方面非常出色,所以让我们把它加进去

按要在其中检查DUP或近DUP的列对数据进行排序。垂直显示该列表。直观地浏览列表

反向(col)
重复上述操作。这将发现在字符串的早期有根本性差异的对,但在最后匹配得更好


根据需要,对其他专栏重复上述操作。

为什么要在“12069B0”等无法发音的东西上使用Soundex?我真的不想为Soundex费心。而且,一个soundex和另一个soundex很明显是没有意义的。它们要么相等,要么不相等。通过删除条形码的soundex,性能有所提高,但要从5K记录中获取结果,我们需要更高的性能。我们不能使用equal,因为预期的搜索可能是“12069 B0”或“120-69B0”。请告知上述查询的另一个备选方案/建议。SOUNDEX“120-69B0”与“12069 B0”的“相似性”不大于(或小于)与其“相等”。