• 締切済み

MySQLからデータを1つ取り出すのに要した時間を表示させたい

はじめまして。いつも皆さんの質問・回答を見て勉強させていただいてます。 今、DBを使ったJavaの検索システムを構築しており、検索時の効率を上げる為のデータとして、検索時に要した時間を表示させたいと思っております。 また、それは全体(SQL文を実行する)に要した時間ではなく、データ一つを検出するのにどれだけ時間を要したか?という値を知りたいのです。 つまり、クエリ実行の結果ではなく、SQL文1つの結果に「Aichi,Gifu,Tokyo」が該当したとして、それぞれをテーブルから探し出した各々の時間を計りたいのです。 イメージとしては下記のようになります。 データ名 | 検索時間(sec) Aichi   | 1.23 Gifu    | 0.23 Tokyo   | 3.53 環境としては Java:jdk1.6.0_13 MySQL:ver5.5 です。 以下の点を考慮しましたが、壁にぶつかってしまいました ・insert文で新たに検索時間を格納するフィールドを作る(検索ごとにデリート、インサートしてたらキリがない) 以上、ご指導よろしくお願いします。

みんなの回答

回答No.2

>MySQL:ver5.5 MySQL 5.5なんて存在しないのでは? >SQL文1つの結果に「Aichi,Gifu,Tokyo」が該当したとして、それぞれを >テーブルから探し出した各々の時間 それぞれを、別のSQLとして検索するしかありません。 それも、種々のキャッシュをクリアする等しなければ、正確には得られません。 なぜなら、 (1)MySQLへの接続 (2)SQL文の解析~実行計画の生成  →MySQL 5.0以降であれば、ストアドプロシジャ化すれば、この部分のオーバーヘッドは少なくなる (3)実行計画により、DBのI/Oが少なくなるように配慮される  →1件目、2件目と得るたびに、物理的に先頭からサーチしたりはしない (4)ソートが必要な処理なら、1行目を得る段階でソートが発生する(している) といったものを、どのデータを得るための処理かといった配分をするのは意味がありません。 また、別のSQLとしても、 (1)SQLの解析結果をキャッシュとして持っていて、2回目以降のSQLでの実行計画生成のオーバーヘッド抑止 (2)DBのI/Oバッファ(キャッシュとも呼ばれる)に上がっている場合は、実I/Oは発生しない といったことがあるので、キャッシュ類をクリアしなければ、正確な処理時間は分析できません。 こういった測定をやる場合、簡単な方法としては、 (1)測定したい最小の結果を得るSQLにする (2)アプリ側で、SQL実行前後の時刻を取得し、その差分を得る といった方法を取る場合が多いです。 RDBMS側で各種統計を取らせるオプションがあったりしますが、そういった機能を使った場合、その分のオーバーヘッドが生じます。 MySQLでRDBMS側で統計的な情報を取りたいと思えば、MySQL 5.0.xx(番号未確認)くらいから実装されたslowログを採取、表示するといった方法もありますが、MySQL 5.1.xxで不良があるとか、ころころ仕様変更があったりします。 なお、この場合も、情報を得たい最小の結果を得るようにして、SQLを実行する必要があります。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

意図がよくわからないのでなんともいえませんが、 実検索時間なんてキャッシュもあるのであまり意味がないかと。 それよりもEXPLAINで検証しながらチューニングすることを 考えたほうがよいかと。

tty5963
質問者

お礼

回答ありがとうございます。 今回、木構造による検索をプログラミングしていて、どのデータの検索にどれほどの時間を要しているかのデータを取った上で、要した時間の多かったものから、改善に着手する為に各々のデータにおける検索時間が知りたいという意図がります。 例えば、北海道というデータが一番時間がかかるのであれば、北海道という文字コードなりを洗い出して、検索を早くする木構造を考えたいという流れです。 EXPLAIN構文のアイディアありがとうございます。 ただ、全体の検索時間を早めたいわけではないので、他に手段ありましたらご教授お願いします。

すると、全ての回答が全文表示されます。

関連するQ&A