2013-03-18 80 views
0

所以,我有这个奇怪的想法,用单词匹配散列。然而,由于获得比赛的可能性很小,我需要一个带有散列和文字的大型数据库。我已经有了一个庞大的数据库,里面有数百万个随机/真实的单词以及与这个单词相对应的散列。查找数据库中的HASH字符串(mysql和php)

然而,这个问题将被搜索。我在这个大型的数据库上没有经验。所以,我在MySQL中用“WHERE”语句做了一些随机测试。猜猜看是什么,花了超过14分钟找到一个匹配,在SQL完成搜索并找到了HASH并给出了WORD之后。

我应该如何加快这个过程?我使用PHP和MySQL。需要在我的服务器上安装其他东西吗?还是有东西已经内置到MySQL,我可以使用?

+0

看看'sphinx'搜索 – tradyblix 2013-03-18 07:23:44

+0

做了一个谷歌搜索,不太明白它是如何工作的? – Dexty 2013-03-18 07:39:48

回答

-1

添加一个自动递增的主键并将其命名为id。

我写了一个脚本这需要所有词语的/etc/dict跑MD5他们,写出他们的名字和哈希创造这样的事情:

"2af2fc92ed1ee8080d9ab015ab053074", "Windex's 
"bfa818f0cac66108daef757706e97a99", "Windhoek 
"88d0e322fb73a2e971bc982bd348c777", "Windows 

我这样做的途径是非常哈克所以我习惯后我实现它的方式,但总体而言,它是相当简单的,只是基本上是围绕着基于:

while read line 
    do 
     echo $line | md5sum | awk '{print $1}' 
    done 

所以我创建了一个数据库表:

CREATE TABLE whashes 
    (
    id int auto_increment primary key, 
    hash varchar(32), 
    word varchar(16) 
    ); 

,并用于:

INSERT INTO whashes 
(hash, word) 
VALUES 

随着我的脚本的输出上面。运行速度测试。

SELECT * 
FROM `whashes` 
WHERE word LIKE "poop" 
LIMIT 0 , 30 

在0.0324秒内运行。这是与10万字,应该留在那个速度

SELECT * 
FROM `whashes` 
WHERE hash LIKE "b538baf8573b52b5bcfdd551fffa6e9d" 
LIMIT 0 , 30 

运行在0.0202秒。

根据我的理解,使用自动递增的主ID整数密钥计算机可以保留大量的ID在缓存中,并对这些值做一些二进制搜索。如果没有像这样的密钥,数据库引擎必须遍历每个值来检查它,相比之下,一次检查将每次需要检查的数量减少一半。然而,这个解释可能稍微不正确,但是如果我错了,其他人可能会解释更多/纠正我。只要做这样简单的事情应该会给你一个很大的改进。

+0

这会如何加速这个过程? – 2013-03-18 07:19:17

+0

@DarylGill如果你仍然好奇,我试图添加一些背景。 – jett 2013-03-18 10:07:43

+0

完全按照你的说法,并运行sql搜索。 9分钟,用于运行所有记录。这是一张9.1GB的桌子。 – Dexty 2013-03-18 11:29:40