どちらが PHP , MySQL 的に負荷が少ないのでしょうか?技術的な説明お願いします。


1、 hatenaのような単語を<>で仕切り1つのレコードのwordというカラムに全部入れます。そして 変数 $hoge に入っている値がwordカラムに入っている値の<>で仕切られている単語どれか1つにヒットしたらOKというサインを表示

2 hatenaのような単語を1つ1つ別々のレコードに格納。 $hogeに入っている変数を slect word from.. で照会。レコード数が 0以上の場合はOKサインを表示

ちなみに今回の場合はデータ数の量はぬきで考えてください。

質問に対する質問はコメントで受け付けております。どうぞよろしくお願い申し上げます。

回答の条件
  • 1人5回まで
  • 登録:2007/02/21 13:29:25
  • 終了:2007/02/28 13:30:03

回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/02/21 13:48:29

ポイント27pt

データ数の量はぬきで考えてください

パフォーマンスを論ずるのにそれは無理な話です。


結論から言うと状況によってどちらが早いかが変わります。

まず、一般的には INDEX が使用できるかどうかで大幅に検索速度が変わると思ってください。


1.は基本的に MySQL の INDEX が使えません。

フルテキストインデックスを使う手も有りますが、標準では日本語に対応していない為、よほど工夫しないと面倒です。


2.は文字列の完全一致もしくは前方一致の場合は INDEX が使用できるので一般的にはこちらの方が早くなります。


例外として INDEX を引くよりフルテーブルスキャンをした方が早いような場合(レコードが少ないような場合)1の方が早くなる可能性はあります。

また、今回の場合 MySQL のレベルで大抵差がつくので PHP の処理はあまり関係ありません。

id:esecua

ありがとうございます。

> パフォーマンスを論ずるのにそれは無理な話です。

分かりました。では300単語として考えてください。単語の長さは最小で4文字最大で40文字のものがランダムに入っている感じです。

ちなみに単語は半角英数字のみですので日本語ではありません。初めに伝えておくべきでしたすいません。

こうなるとどうでしょうか?

よろしくお願いいたします。

2007/02/21 13:55:09
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/02/21 14:11:21

ポイント27pt

分かりました。では300単語として考えてください。単語の長さは最小で4文字最大で40文字のものがランダムに入っている感じです。

すごく微妙なライン。

そのデータ量ならキャッシュを多めに取って置けばたぶんキャッシュのみで応答が返る。

こうなると INDEX はむしろ邪魔。

あとは PHP と MySQL の文字列操作関数のどちらが早いかというレベルになると思う。


サーバースペックによって結論が変わるので実際に計測してみないとなんともいえないが、自分の予想ではたぶん1の方が早い。

ただ、今後データが増える可能性があるなら2の方が汎用的。


具体的な結論でなくて申し訳ないが考察としてはこんなところでどうでしょう?


余談ですけど、1の場合セパレーターを使って入れるよりも PHP の方で単語をキーとしたハッシュを作っておき、MySQL は単なるデータストレージとして使うの(ハッシュをシリアライズして入れるだけ)が速いんじゃないだろうか。

id:esecua

ありがとうございます。

> 余談ですけど、1の場合セパレーターを使って入れるよりも PHP の方で単語をキーとしたハッシュを作っておき、MySQL は単なるデータストレージとして使うの(ハッシュをシリアライズして入れるだけ)が速いんじゃないだろうか。

ちなみに毎回そのデータは表示するのでmd5などでハッシュしてしまうと元に戻せなくなりNGです。

よろしくお願いいたします。

2007/02/21 17:16:19
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402007/02/22 10:16:35

ポイント26pt

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に突っ込む。

Storable - Perlデータ構造体の永続化

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 関数を使うらしい。

PHP: serialize - Manual

もはやDBをつかってる意味が良く分からなくなるけど。

id:esecua

thanx

2007/02/23 09:43:40
  • id:b-wind
    >ちなみに毎回そのデータは表示するのでmd5などでハッシュしてしまうと元に戻せなくなりNGです。
    そのハッシュじゃないよ連想配列だよ。
  • id:b-wind
    > Perlかよ。
    一応相手を見た上でコンセプトは通じると思いましたが、通じませんでしたか?
  • id:b-wind
    それは残念です。
    ポイント無しでも結構ですよ。
  • id:b-wind
    えーと、別に怒ってはいませんよ。
    ただ本当に PHP では正確に書く自信が無かったんで Perl で書いたんですが、通じなかったのは残念だなと。
    言葉遣いがちょくちょく変わるのはいつものことです。気にされませぬよう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません