我正在清理一个我继承的脏数据库,并且需要对模糊匹配名称进行人工审查。我提出了一个可行的解决方案,但速度非常慢 - 15k行7分钟。我有这种感觉,我忽略了一些非常简单的解决方案。MySQL优化查询“模糊匹配”重复?
记录示例:
1 John Smith
2 John Q Smith
3 Janway Smith
4 Jane Chen
5 David Jones
6 Natalia La Brody
7 Natalia LaBrody
8 LaBrody
9 Dave Jones
我需要为这个模糊匹配多个条件。两个我想出了包括:
- 检查匹配的前三名和最后五个字母的concat。
- 如果对所有的最后一句话一个字检查
- (我可以添加更多的条件)
我的代码如下所示:
UPDATE authors a
INNER JOIN (SELECT id, author_name FROM authors) b
ON CASE WHEN a.author_name NOT REGEXP ' '
THEN
a.author_name =
substring_index(b.author_name, ' ', -1)
ELSE
concat(LEFT(a.author_name, 3), RIGHT(a.author_name, 5)) =
concat(LEFT(b.author_name, 3), RIGHT(b.author_name, 5))
END
SET tags = concat_ws(',',tags,'Duplicate?')
WHERE a.id <> b.id
我很惊讶,我可以把一个CASE一个ON条款,但它的工作。尽管如此,我该如何以更好的表现来做到这一点呢?
我后指出人工检验的需求。这是为了加快这一进程,否则我们手动检查15,000条没有优先级的记录。但是感谢Levenshtein距离的提示,这可能会有所帮助。 – Slam
Levenshtein距离计算大量耗时,并且可悲地根本无助于回答原始问题。 – Slam