如何提高strcmp mysql性能比较类似的字符串

pb3s4cty  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(216)

我希望这不是一个被骗的问题。我找遍了,没有找到任何一个像我这样的问题,但是...
我有一个包含用户数据的表,我们知道其中存在重复项。该表包含超过30k个条目,并且正在不断增长。预计最大容量约为100k。我正在运行一个进程来查找重复条目,但是,这里是“但是...”重复项是“相似”的条目,而不是完全重复的条目。
标准如下:如果它们属于同一个组并且具有相似的名称,则认为是重复的。
相同的组只是与另一个表的连接,正确地索引,等等。这部分工作正常。
相似的名称意味着相同的名称忽略大小写,修剪和忽略内部空格。所以“joHn sMith”(初始空格)等于“JOHN SMITH“(中间和最后空格)和“john smith“(初始,中间和最后空格)。
我的初始策略非常慢:我有一个视图和一个解析视图的stored。stored一个接一个地删除重复的条目,因为删除重复的条目很复杂,会影响到其他几个表。
存储的工作效率或多或少,但视图是可怕的。
该视图将包含人员的表连接到其自身,并且该计划显示,当然,问题在于针对每个比较对人员的表进行的完全扫描:
strcmp(替换(lcase(trim(s . name)),“”,“”),替换(lcase(trim(t . name)),"“,”"))= 0
请注意,s.和t.指的是同一个人的表。
有什么建议吗?
非常感谢。

3ks5zfa0

3ks5zfa01#

从你的问题中,我们并不清楚一个人是一个群体的直系后代,还是多个群体的成员。假设是前者,我只会说:

WITH dupes AS (
    SELECT id, MIN(id) OVER w AS replace_with_id
    FROM people
    WINDOW w AS (PARTITION BY group_id, LCASE(REPLACE(name, ' ', '')))
)
SELECT *
FROM dupes
WHERE id <> replace_with_id;

字符串
由于您的预计最大行数只有100 k行,这应该比您的非sargable self-join快得多。在300 k行的随机(ish)集合上进行0.01%的重复率测试,它在大约70 ms内返回了34行用于合并/替换。

u3r8eeie

u3r8eeie2#

我会这样做:
1.添加一个新列以保存规范名称;例如,将名称转换为全部大写,并删除了多余的空格和其他字符。
1.填入数据行。
1.为该列添加索引。
1.通过按规范名称的顺序阅读记录并合并/以其他方式处理重复记录来执行重复数据删除。
(It是否应该保留具有非规范形式名称的原始列,这一点值得商榷。)
粗略地说,其复杂性如下:
1.是O(1)。
1.时间复杂度O(N)
1.是O(NlogN)。
1.时间复杂度为O(1),时间复杂度为O(1)。
我想...

相关问题