0

それで、ハッシュと単語を一致させるという奇妙なアイデアを思いつきました。ただし、一致する確率は小さいため、ハッシュと単語を含む大規模なデータベースが必要になります。何百万ものランダムな/実際の単語とその単語に対応するハッシュを含む巨大なデータベースを既に持っています。

ただし、問題は検索です。この大規模なデータベースの経験はありません。そのため、MySQL などで「WHERE」ステートメントを使用してランダムなテストを行いました。SQL が HASH を検索して検索し、代わりに WORD を返す前に、一致を見つけるのに 14 分以上かかりました。

このプロセスをスピードアップするにはどうすればよいですか? PHPとMySQLを使用しています。サーバーに何か他のものをインストールする必要がありますか? または、使用できるmysqlに既に組み込まれているものはありますか?

4

1 に答える 1

-1

自動インクリメントの主キーを追加し、id という名前を付けます。

すべての単語を取り込んで/etc/dictmd5 を実行し、名前とハッシュを書き出すスクリプトを作成して、次のようなものを作成しました。

"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 秒で実行されます。これは 100k ワードであり、その速度を維持する必要があります。

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

0.0202 秒で実行されます。

私の理解では、自動インクリメント プライマリ ID 整数キーを使用すると、コンピューターは大量の ID をキャッシュに保持し、それらの値に対してバイナリ検索を行うことができます。このようなキーがないと、データベース エンジンは各値をループしてチェックする必要がありますが、1 回のチェックでは毎回チェックする必要のある量が半分になります。ただし、この説明は少し間違っている可能性がありますが、他の誰かがさらに説明したり、間違っている場合は修正したりできるかもしれません. このような単純なことをするだけで、大きな改善が得られるはずです。

于 2013-03-18T07:17:59.863 に答える