- 締切済み
MySQLにおける検索速度について
はじめまして。 GOOと同じWeb上における質問&回答システムのようなものを作っております。 サーバ構成は、 CPU:2.4GM MEMORY:1GM OS:RedHat7.2 WWWサーバ:Apache1.3x DB:MySQL3.23 インターフェースにはPHP4.2を使用しております。 テーブル構成は、基本的に、 [質問テーブル] 質問No.(PK) 質問タイトル 質問内容 [回答テーブル] 回答No.(PK) 質問No.(FK) 回答内容 のようにしております。 検索の方法は、 該当件数は、select count(質問No.) from 質問テーブル で取得し、 一覧は、select * from 質問テーブル limit a,b order by 質問日時; のようにlimitを使用して表示する件数だけ取得しています。 現在ダミーデータを使用してテストしています。 同時アクセスのないローカルで単体でテストしています。 1万件をこえるあたりから急に検索のときにつっかかるくらいの遅滞が発生し、 3万件からそれが顕著になり、 30万件では2秒くらいかかります。 これはしょうがないのでしょうか。 「教えてGOO」等はすぐ検索されますが、どのようになっているのでしょうか? 検索の早いMySQLとはいえフリーだからしょうがないのでしょうか。 MySQLはデフォルトの設定のままです。 (MySQL使用するメモリ等を多少いじってみたのですがあまり変化がありませんでした) 個人的には、あとは、MySQLの適切なパラメータ設定、テーブル設計あたりだと思っているのですが、経験不足でこれだというものが思いつきません 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Goody-goody
- ベストアンサー率33% (4/12)
まず、質問テーブルには、 質問No.(PK) 質問タイトル 質問内容 だけでなく、「質問日時」もありますよね。 で、この、「質問日時」にインデックスをつけていますか? select文は、この「質問日時」でソートしているので、「質問日時」にインデックスをつけることは必須です。 HDDの切り方などにもかなり左右されますが、まずはインデックスを設定しているかどうかが大きいです。
- nightowl
- ベストアンサー率44% (490/1101)
典型的な LAMP プラットフォームですね。 私も素人ですが、まず「OKWeb/教えて!goo」のような大規模なサイトだと 複数のマシンを並列で走らせているのではないでしょうか。 MySQL については「Software Design」3月号で特集していましたので、 まだお読みでなかったらバックナンバーを取り寄せられることをお勧めします。 それによれば、テーブルタイプが MyISAM だったら InnoDB に代えると 多少スピードが改善されるようです。 それから、Linux のカーネルも最新安定版に代えた方がよいと思われます。 チューニングについては以下もご覧ください。 http://www.mysql.jp/mysql/TIPS/tune.html http://www.atmarkit.co.jp/flinux/rensai/mysql11/mysql11a.html
お礼
ご親切に有難う御座いました。 参考に致します。
補足
有難う御座います。 インデックスは、質問番号、分類番号、質問日時につけています。 該当総数を取得するSQL文 select count(*) as allhit from 質問テーブル where XXX. がヒット件数によって速度にとても影響しているようです。例えば、30万件のうち6000件ヒットは心地よくでてきますが、30万件のうち5万件ヒットになると実用性としては遅い感じがします。 遅滞の一番の原因が ・ヒット数が多い問題 ・総データ数が多い問題 どちらが問題で、どう関係しているのかイマイチよく把握できていません。 あとはハード面の調整になるのでしょうか・・・ また、30万件のデータの中でヒットが20万件になると、上記のようなSQL文が遅くなってしまうのはどのデータベースでも同じなのでしょうか? 個人的にはヒット数が30万件くらいまではなんとか即表示出来たらなと思っております。 何かご意見ありましたら宜しくお願い致します。