人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Hatena hoge MySQL PHP Word
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

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

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


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

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


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

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


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


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

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

◎質問者からの返答

ありがとうございます。

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

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

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

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

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


2 ● b-wind
●27ポイント

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

すごく微妙なライン。

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

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

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


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

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


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


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

◎質問者からの返答

ありがとうございます。

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

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

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


3 ● b-wind
●26ポイント

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をつかってる意味が良く分からなくなるけど。

◎質問者からの返答

thanx

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ