MySQL JDBC ドライバーでクライアント側のエミュレーションによって準備されたステートメントがどのように機能するかを理解しようとしています。
パート 1 オンラインで、プリペアド ステートメントの場合、リレーショナル データベースが JDBC/SQL クエリを処理するときに必要な 4 つの手順があり、それらは次のようになっていると読みました。
- 受信 SQL クエリを解析する
- SQL クエリをコンパイルする
- データ取得経路の計画/最適化
- 最適化されたクエリを実行/データを取得して返す
ステップの事前実行によって SQL ステートメントがコンパイルされるため、事前最適化が提供されます。サーバー側のプリコンパイル済みステートメントの場合、SQL ステートメントをプリコンパイルするために、データベースに対して追加のラウンドトリップが行われます。
質問 データベースへのラウンドトリップを行わない場合、クライアント側エミュレーションの準備済みステートメントはどのようにステップ 3 を実行しますか? または、クライアント側エミュレーションの準備済みステートメントは別の方法で動作しますか?
パート 2 また、2 つの実験を行いました。
- 実験 1 - クエリごとに 1 つのクライアント側の準備済みステートメントを使用する
- 実験 2 - 同じクエリに対してクライアント側で準備されたステートメントを複数回「再利用」する
どちらの実験でも、応答時間などのパフォーマンスの向上が見られます。実験 1 では約 18% の改善が見られ、実験 2 では約 30% の改善が見られます。
質問
- クライアント側の準備済みステートメントに事前最適化がまだ存在すると仮定するのは正しいですか?
- はいの場合、サーバー側 (パート 1 で説明した 4 つのステップ) のプリペアド ステートメントと同様の方法で事前最適化しますか?
- 「いいえ」の場合、まだ改善されているのはなぜですか?
ご協力いただきありがとうございます!