我正在清理一個我繼承的髒數據庫,並且需要對模糊匹配名稱進行人工審查。我提出了一個可行的解決方案,但速度非常慢 - 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