如何加快比较数据库中的MD5哈希值

时间:2011-07-15 18:45:56

标签: sql xml optimization md5

我有一个数据库,其中包含来自许多不同网站的待售计算机的分类广告。数据库由从各个站点广告接收的XML文件填充,然后解析并放置在数据库的中央表中。

XML文件对每台计算机都有以下属性:制作,型号,高清大小,RAM大小,处理器速度,价格,位置等。

然后中央数据库表具有相同的列,在开始时加上一个额外的列,这是我们自己使用的ID字段。

由于广告是由公众创建的,因此他们经常将广告放在我们的一个或多个合作伙伴网站上,因此会创建宣传同一台计算机的重复广告,我需要识别数据库中重复的广告。

识别广告的问题在于没有唯一的字段(例如,与具有注册号的汽车不同)。

我的想法是在表中添加一个额外的列,其中包含其他列内容的MD5哈希值。解析XML时,会为每个广告创建MD5哈希,然后将其添加为最终列。

一旦将记录添加到表中(向上100k),就会运行一个查询以识别任何匹配的MD5哈希值,但这需要太长时间,并且通常超出查询次数(即使超时已延长)

我的问题是:MD5哈希路由是最好的吗?如果是这样,我将如何加快查询速度?如果不是,那么识别重复广告的最佳方法是什么?

谢谢,

3 个答案:

答案 0 :(得分:3)

我们使用MD5哈希来快速识别行并拥有数亿行数据,因此我认为这是一个合适的选择。

您持有MD5的列上有索引吗?请注意,如果要在表中保留重复提交,则它可以是非唯一索引,如果要阻止插入重复,则可以是唯一索引。

如果仍然没有达到所需的速度,可以考虑使用64位哈希。有些人为非常大量的应用程序做到这一点,因为它将索引字段的大小减少了一半。我怀疑你需要为你提到的音量做到这一点。

请注意,对广告文字的最轻微更改将导致新的MD5值(甚至是额外的空间)。如果可以进行格式更改,您可能需要在执行MD5之前规范化数据,例如通过删除所有空格,标点符号并始终包含数据。

答案 1 :(得分:2)

似乎在哈希列上添加索引可以提供帮助。

答案 2 :(得分:-1)

好吧,因为您只对使用MD5查找重复项感兴趣,这可能不是最佳选择。请记住,MD5被设计为加密哈希,速度并不是最重要的目标(实际上许多现代安全哈希都是按设计制作的!)。

我亲自实现一个简单的哈希并使用它。正如Eric J.所指出的那样,在使用它之前,无论如何都必须规范化你的数据,在规范化步骤之后,你只需通过哈希函数运行它并使用它。

最简单的方法是将所有字段作为字符串处理,并使用通常的字符串哈希算法:

s [0] * KEY ^(n-1)+ s [1] * KEY ^(n-2)+ ... + s [n-1]

键通常是一些低素数(对于通常的英语词典31或49,iirc导致最低的冲突,但是因为你的哈希计算了几个可能无关紧要的字段)。这很简单,实现起来很快 - 也意味着你使用字大小的哈希,它也应该更快。

无论如何回到你的实际问题:添加一个索引(非唯一!)将是最简单的解决方案,但我会测试是否只有在添加所有文件后才能更快地激活索引(这意味着数据库将不得不将文件排序一次,但插入时会更快) - 你必须测试那些东西。