プロが教える店舗&オフィスのセキュリティ対策術

10万件程度レコードをもつ2つのテーブルに対し、下記のようなSQL文を実行します。
(実際のSQL文とは違いますが、だいたいこんな感じです。)
SELECT * FROM aaa JOIN bbb USING(key) WHERE ORDER BY ccc LIMIT 50 OFFSET 5000

すると、
CGIから実行→CPU使用率が一時的に60%を超える。1~2秒待たされる。
phpMyAdminから同じSQL文を実行→CPUほどんど消費せず。瞬時に終わる。

のようにCGIからとphpMyAdminからで速度に大きな違いがあります。
こんなに差が付いてしまう理由がわかりましたら教えていただきたく。

A 回答 (2件)

どのような方法で、測定しているのでしょうか?


キャッシュ(データベースのI/Oバッファ、同じSQL実行時にSQL解析・実行計画作成時のオーバヘッドを抑止するクエリキャッシュ等)を利用できるような測定方法だと、1回目より2回目以降が早くなったりします。

>10万件程度レコードをもつ2つのテーブルに対し、下記のようなSQL文を実行

母体データが10万件として、ヒットするのは何件くらいなのでしょう?
検索条件が省略されていますが、インデクスにより絞り込めるものになっているのでしょうか?
念のために確認しますが、比較対象としているSQLは、どちらもまったく同じ結果になるものなのですよね?
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
chukenkenkouさんのおっしゃるとおり、キャッシュによる差だったようです。
今いろいろ調べて知ったのですが、MySQLではプリペアドステートメントを使うとクエリキャッシュが効かなくなるのですね…。
CGIではSQL文の実行にプリペアドステートメントを使っていたので(phpMyAdminからは使ってない)、それがキャッシュを使う、使わないという差になって負荷の違いにつながったようです。
勉強になりました。ありがとうございました。

お礼日時:2009/09/19 20:26

まずひとつの切り分けとして。


もう少し情報をください。

MySQLのサービスが起動しているサーバと
Apache(CGI)のサービスが起動しているサーバは
同じサーバでしょうか?

この回答への補足

回答ありがとうございます。
サーバは同じです。
topコマンドで各プロセスの状況を確認しているのですが、mysqldのCPU使用率が上がるのでMySQL側に負荷がかかっていると考えました。(CGIも若干上がります)

補足日時:2009/09/18 08:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す