3

MySQL JDBC ドライバーでクライアント側のエミュレーションによって準備されたステートメントがどのように機能するかを理解しようとしています。

パート 1 オンラインで、プリペアド ステートメントの場合、リレーショナル データベースが JDBC/SQL クエリを処理するときに必要な 4 つの手順があり、それらは次のようになっていると読みました。

  1. 受信 SQL クエリを解析する
  2. SQL クエリをコンパイルする
  3. データ取得経路の計画/最適化
  4. 最適化されたクエリを実行/データを取得して返す

ステップの事前実行によって SQL ステートメントがコンパイルされるため、事前最適化が提供されます。サーバー側のプリコンパイル済みステートメントの場合、SQL ステートメントをプリコンパイルするために、データベースに対して追加のラウンドトリップが行われます。

質問 データベースへのラウンドトリップを行わない場合、クライアント側エミュレーションの準備済みステートメントはどのようにステップ 3 を実行しますか? または、クライアント側エミュレーションの準備済みステートメントは別の方法で動作しますか?

パート 2 また、2 つの実験を行いました。

  1. 実験 1 - クエリごとに 1 つのクライアント側の準備済みステートメントを使用する
  2. 実験 2 - 同じクエリに対してクライアント側で準備されたステートメントを複数回「再利用」する

どちらの実験でも、応答時間などのパフォーマンスの向上が見られます。実験 1 では約 18% の改善が見られ、実験 2 では約 30% の改善が見られます。

質問

  1. クライアント側の準備済みステートメントに事前最適化がまだ存在すると仮定するのは正しいですか?
  2. はいの場合、サーバー側 (パート 1 で説明した 4 つのステップ) のプリペアド ステートメントと同様の方法で事前最適化しますか?
  3. 「いいえ」の場合、まだ改善されているのはなぜですか?

ご協力いただきありがとうございます!

4

1 に答える 1

3

簡単な答え: そうではありません。デフォルトでは、MySQL ドライバーは、パラメーター化されたクエリと (エスケープされた) パラメーター値から作成されたクエリ文字列を単純に実行します。パラメーターのプレースホルダーをエスケープされた値に置き換えることで、このクエリをローカルに作成し、サーバーに送信します。

PreparedStatementJDBC では、サーバー側で実際に準備することも、パフォーマンスを「向上させる」ことも必要としないことに注意してください。JDBC はそれらが機能することのみを必要とします。as in: as parameterplaceholders を使用してクエリを指定する?と、ドライバーはメソッドによって設定された値を使用してステートメントを正しく実行しsetXXXます。

useServerPrepStmtsまた、MySQL にはサーバー側で準備されたステートメントがありますが、 valueで接続プロパティを使用して明示的に有効にする必要があることに注意してくださいtrue

于 2014-03-19T10:52:19.137 に答える