1、 hatenaのような単語を<>で仕切り1つのレコードのwordというカラムに全部入れます。そして 変数 $hoge に入っている値がwordカラムに入っている値の<>で仕切られている単語どれか1つにヒットしたらOKというサインを表示
2 hatenaのような単語を1つ1つ別々のレコードに格納。 $hogeに入っている変数を slect word from.. で照会。レコード数が 0以上の場合はOKサインを表示
ちなみに今回の場合はデータ数の量はぬきで考えてください。
質問に対する質問はコメントで受け付けております。どうぞよろしくお願い申し上げます。
データ数の量はぬきで考えてください
パフォーマンスを論ずるのにそれは無理な話です。
結論から言うと状況によってどちらが早いかが変わります。
まず、一般的には INDEX が使用できるかどうかで大幅に検索速度が変わると思ってください。
1.は基本的に MySQL の INDEX が使えません。
フルテキストインデックスを使う手も有りますが、標準では日本語に対応していない為、よほど工夫しないと面倒です。
2.は文字列の完全一致もしくは前方一致の場合は INDEX が使用できるので一般的にはこちらの方が早くなります。
例外として INDEX を引くよりフルテーブルスキャンをした方が早いような場合(レコードが少ないような場合)1の方が早くなる可能性はあります。
また、今回の場合 MySQL のレベルで大抵差がつくので PHP の処理はあまり関係ありません。
分かりました。では300単語として考えてください。単語の長さは最小で4文字最大で40文字のものがランダムに入っている感じです。
すごく微妙なライン。
そのデータ量ならキャッシュを多めに取って置けばたぶんキャッシュのみで応答が返る。
こうなると INDEX はむしろ邪魔。
あとは PHP と MySQL の文字列操作関数のどちらが早いかというレベルになると思う。
サーバースペックによって結論が変わるので実際に計測してみないとなんともいえないが、自分の予想ではたぶん1の方が早い。
ただ、今後データが増える可能性があるなら2の方が汎用的。
具体的な結論でなくて申し訳ないが考察としてはこんなところでどうでしょう?
余談ですけど、1の場合セパレーターを使って入れるよりも PHP の方で単語をキーとしたハッシュを作っておき、MySQL は単なるデータストレージとして使うの(ハッシュをシリアライズして入れるだけ)が速いんじゃないだろうか。
ありがとうございます。
> 余談ですけど、1の場合セパレーターを使って入れるよりも PHP の方で単語をキーとしたハッシュを作っておき、MySQL は単なるデータストレージとして使うの(ハッシュをシリアライズして入れるだけ)が速いんじゃないだろうか。
ちなみに毎回そのデータは表示するのでmd5などでハッシュしてしまうと元に戻せなくなりNGです。
よろしくお願いいたします。
PHP は得意じゃないのでまず Perl でサンプルを出しておく。
use Storable; # keys word is ( 'a' , 'b', 'c' , 'd' ); my %key_hash = ( a => 1, b => 1, c => 1, d => 1, ); my $serialize = Storable::freeze(\%key_hash); # $serialize をDBに突っ込む。
use Storable; # $serialize をDBから取り出す。 my $key_hash = Storable::thaw($serialize); # keyword 'a' があるかどうか確認。 my $keyword = 'a'; if ( exists $key_hash->{$keyword) ) { print "ok!\n"; }
PHP の場合 serialize 関数を使うらしい。
もはやDBをつかってる意味が良く分からなくなるけど。
thanx
ありがとうございます。
> パフォーマンスを論ずるのにそれは無理な話です。
分かりました。では300単語として考えてください。単語の長さは最小で4文字最大で40文字のものがランダムに入っている感じです。
ちなみに単語は半角英数字のみですので日本語ではありません。初めに伝えておくべきでしたすいません。
こうなるとどうでしょうか?
よろしくお願いいたします。