PHPを使いデータベースの中身をSELECTで表示しているのですが
動作が遅く表示に2秒ほどかかってしまいます。
データベースはMYSQLで項目数は10万件ほどです。
JQUERYのロード機能でPHPの検索システムを呼び出しています。
カテゴリの部分はRDBでテーブルを分けており
INNER JOINで結合しています。
カテゴリをテーブルで分割しており
検索スピードを上げるにはインデックスを使うのが良いというのはわかったのですが
文字数が最大日本語で500文字ほどあり(varcharで1,000と設定しています)
255が上限らしくインデックスがつけられないようです。
MYSQLで日本語500文字ほどの文を検索する場合
インデックスをつける方法はないでしょうか?
そもそも検索スピードを早くするには、こうしたほういいという方法もあればよろしくお願いします。
>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の仕方とか・・。
コメント(5件)
あと、カテゴリのJoinの部分を除いてSQL流したらどうなのかとか…。
キーだけ二つに分割して、ほかの部分は 同じとするか もしくは キーだけのテーブルを作って
元のテーブルとは 別のIndexとリンクさせるなどです。
ま、これが有効なのかどうかはやってみないとわからないですが。
また キーが 分割できるのか?ということも ありますけど。
文字数を気にしてるということは、文章のようなデータをキーワード検索したい、
つまり、like 検索をする、ということですよね。
インデックスを張ると速くなるのは、以下の理由からです。
・データ全体に比べて、検索対象のデータが少ないから、探すために読み込むデータ量が少なくなる
・インデックス自体が、値が一致したデータを探しやすい構造になっている(ハッシュとかツリーとか)
例えば、辞書を引くことを想像してみてください。
例えば、「ロード」という単語の意味を調べるとしましょう。
「ろ」で始まってるので、まず、「ら行」のマークの辺りの、厚みで 4/5 位のところを開きますよね。
で、開いたページに載ってる単語を見て、「れんげ」とかあれば、それより後ろのページを適当な枚数で開く。
「ロカビリー」とか出てきたら、行き過ぎちゃったので、数枚戻して開く。
これが(正確じゃないですけど)インデックスを使った検索です。
これに対して、インデックスを使わない検索、というのは、一ページ目から一枚ずつめくって
「ロード」が出てくるまで、ひたすら探す、という行為と同じです。
>>
そもそも検索スピードを早くするには、こうしたほういい
<<
アプローチは、いろいろあります。
・辞書のように見出し語のようなものを作って、それを検索対象にする
・RDB を止めて、全文検索に特化したソフトウェアを使う
・テーブルを分割して、並列で検索をかける
万能な方法は無いので、対象データの特性や、コスト(含む、手間や CPU などのリソース)と性能のトレードオフで探っていくことになると思います。
http://futuremix.org/2010/04/mysql-innodb_buffer_pool_size
いろんな方法を提示していただきありがとうございます。
知らないことだらけで勉強になりました。
とりあえず、パパトモさんに教えていただいた
メモリ関係の設定を見なおしたところ
かなり動きが早くなりました
他にも教えていただいたやり方を試していきたいと思います
ありがとうございました。
みなさんコメントに書いていただいていますが
回答欄に記載していただければポイントを配布できますのでよろしくお願いします。