検索スピードに関しての質問です。


PHPを使いデータベースの中身をSELECTで表示しているのですが
動作が遅く表示に2秒ほどかかってしまいます。
データベースはMYSQLで項目数は10万件ほどです。
JQUERYのロード機能でPHPの検索システムを呼び出しています。

カテゴリの部分はRDBでテーブルを分けており
INNER JOINで結合しています。

カテゴリをテーブルで分割しており

検索スピードを上げるにはインデックスを使うのが良いというのはわかったのですが
文字数が最大日本語で500文字ほどあり(varcharで1,000と設定しています)
255が上限らしくインデックスがつけられないようです。

MYSQLで日本語500文字ほどの文を検索する場合
インデックスをつける方法はないでしょうか?

そもそも検索スピードを早くするには、こうしたほういいという方法もあればよろしくお願いします。


回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/05/18 00:05:57
  • 終了:2012/05/25 00:10:12

回答(1件)

id:pretaroe No.1

pretaroe回答回数531ベストアンサー獲得回数752012/05/18 13:10:09

ポイント100pt

>255が上限らしくインデックスがつけられないようです。

MYQSL 4.1あたりの時の制限で
5.1などでは、1000バイトまでOKです。

http://dev.mysql.com/doc//refman/5.1/ja/create-index.html

>そもそも検索スピードを早くするには、こうしたほういいという方法もあればよろしくお願いします

EXPLAIN を実行して、構文解析をしてどこが遅いのかを論理的に確かめて
SELECT文を最適化する
http://dev.mysql.com/doc//refman/4.1/ja/explain.html
http://dev.mysql.com/doc//refman/5.1/ja/explain.html

なるべくINDEXキーを使用した検索で
絞り込んでから、INDEXキーのない項目を検索すると速くはなります。

JOINの仕方とか・・。

  • id:khazad-Lefty
    その「PHPの検索システム」で実行されるSQLをコンソールなどから直接実行した時のレスポンスがどうなのかが気になります。
    あと、カテゴリのJoinの部分を除いてSQL流したらどうなのかとか…。
  • id:taknt
    単純に思いつく方法としては 255が上限なら その上限にそって レコードを二つにわけるとかですね。

    キーだけ二つに分割して、ほかの部分は 同じとするか もしくは キーだけのテーブルを作って
    元のテーブルとは 別のIndexとリンクさせるなどです。

    ま、これが有効なのかどうかはやってみないとわからないですが。


    また キーが 分割できるのか?ということも ありますけど。

  • id:a-kuma3
    多分、インデックスを張っても速くならないです。

    文字数を気にしてるということは、文章のようなデータをキーワード検索したい、
    つまり、like 検索をする、ということですよね。

    インデックスを張ると速くなるのは、以下の理由からです。
    ・データ全体に比べて、検索対象のデータが少ないから、探すために読み込むデータ量が少なくなる
    ・インデックス自体が、値が一致したデータを探しやすい構造になっている(ハッシュとかツリーとか)

    例えば、辞書を引くことを想像してみてください。
    例えば、「ロード」という単語の意味を調べるとしましょう。
    「ろ」で始まってるので、まず、「ら行」のマークの辺りの、厚みで 4/5 位のところを開きますよね。
    で、開いたページに載ってる単語を見て、「れんげ」とかあれば、それより後ろのページを適当な枚数で開く。
    「ロカビリー」とか出てきたら、行き過ぎちゃったので、数枚戻して開く。
    これが(正確じゃないですけど)インデックスを使った検索です。

    これに対して、インデックスを使わない検索、というのは、一ページ目から一枚ずつめくって
    「ロード」が出てくるまで、ひたすら探す、という行為と同じです。


    >>
    そもそも検索スピードを早くするには、こうしたほういい
    <<
    アプローチは、いろいろあります。
    ・辞書のように見出し語のようなものを作って、それを検索対象にする
    ・RDB を止めて、全文検索に特化したソフトウェアを使う
    ・テーブルを分割して、並列で検索をかける

    万能な方法は無いので、対象データの特性や、コスト(含む、手間や CPU などのリソース)と性能のトレードオフで探っていくことになると思います。
  • id:shufutomo
    キャッシュが少ないだけでは?
    http://futuremix.org/2010/04/mysql-innodb_buffer_pool_size
  • id:robopit
    返事が遅くなり申し訳ありません

    いろんな方法を提示していただきありがとうございます。
    知らないことだらけで勉強になりました。

    とりあえず、パパトモさんに教えていただいた
    メモリ関係の設定を見なおしたところ
    かなり動きが早くなりました

    他にも教えていただいたやり方を試していきたいと思います
    ありがとうございました。

    みなさんコメントに書いていただいていますが
    回答欄に記載していただければポイントを配布できますのでよろしくお願いします。

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

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

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

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