2011-10-26 11 views
0

私は辞書webappを作っています。ユーザーは単語を検索します。これを行う方が速いでしょうか?第2の例でどのフィールド構造がMySQLの定義テーブルに適していますか?

SELECT * from definition WHERE word LIKE "house"; 

または...

SELECT * from definition WHERE word_hash LIKE md5("house"); 

、Iはword_hashフィールドの単語のMD5()値を格納します。もちろん、 "word"と "word_hash"はインデックスです。

更新:ワードフィールドが1ワード以上になることがあります。例:SacréBleu

+0

ほとんどの場合、単語の検索が高速になると思われます(長さはハッシュの長さよりも短くなります) –

+0

何らかの理由で定義に複数の単語が含まれる場合はどうなりますか?例:SacréBleu(フランス語) – andufo

+0

私の単語検索の理論(と私はどんなスピードアップが重大ではないだろうと仮定している)が正しいならば、単語はまだまだ高速です。その/それらの単語のハッシュは、 '80d42badd4395b5733ee6e594773776e'であり、結合された単語より少し長い。また、ハッシュのコストを追加していますが、バージョン#1にはハッシュコストがありません。 –

答えて

1

LIKEを完全にスキップする方が速くなります。インデックスword_lcword_lcとしてwordの小文字バージョンを追加しましたし、その後の操作を行います。

select * from definition where word_lc = lower(word_you_want) 

任意の%または_ワイルドカードなしでLIKEを使用して、あなたがその大文字小文字を区別しない比較にまっすぐに行く必要がありますので、念小文字を区別しない平等のテストです索引を活用することができます。また、いつものように、コンピュータがあなたがしたいことをやり遂げることができるように、あなたが意味することを言う。

+0

素晴らしいチップ。ユーザーが "houze"と入力した場合、MySQLに類似のマッチを見つけてユーザーに修正を推奨する方法はありますか? – andufo

+1

@andufo:LIKEはあなたにそれほど役に立たず、 'LIKE md5(...)'はもっと助けになります。たぶん、MySQLの全文検索を見たり、「mysqlファジー検索」でグーグルグーグルをしているかもしれません。 –