• ベストアンサー

同じSQL文で速度がだいぶ違う

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からで速度に大きな違いがあります。 こんなに差が付いてしまう理由がわかりましたら教えていただきたく。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

どのような方法で、測定しているのでしょうか? キャッシュ(データベースのI/Oバッファ、同じSQL実行時にSQL解析・実行計画作成時のオーバヘッドを抑止するクエリキャッシュ等)を利用できるような測定方法だと、1回目より2回目以降が早くなったりします。 >10万件程度レコードをもつ2つのテーブルに対し、下記のようなSQL文を実行 母体データが10万件として、ヒットするのは何件くらいなのでしょう? 検索条件が省略されていますが、インデクスにより絞り込めるものになっているのでしょうか? 念のために確認しますが、比較対象としているSQLは、どちらもまったく同じ結果になるものなのですよね?

trigara
質問者

お礼

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

その他の回答 (1)

回答No.1

まずひとつの切り分けとして。 もう少し情報をください。 MySQLのサービスが起動しているサーバと Apache(CGI)のサービスが起動しているサーバは 同じサーバでしょうか?

trigara
質問者

補足

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

関連するQ&A