11

MySQL はサーバー側のクエリ プランのキャッシュをサポートしていないことを読みました。したがって、パフォーマンス上の利点のために PreparedStatements を使用したい場合は、JDBC 接続でステートメント キャッシングを有効にすることができます。したがって、ドキュメントに従って、接続ごとに準備済みステートメントのキャッシュを有効にします。

MySQL にサーバー側のクエリ プラン キャッシュがある場合と比較して、JDBC 接続による PreparedStatement キャッシュのパフォーマンスの向上は何ですか? したがって、PreparedStatement が実際に物理接続のキャッシュで見つかった場合、mysql サーバーに到達したときに、mysql はクエリの最適化を実行せず、直接実行できるということですか?

MySQL をデータベースとして使用している場合でも、JDBC 接続レベルでステートメント キャッシュを使用する必要がありますか? Mysql JDBC コネクタで Hikari データベース接続プールを使用しています。

4

4 に答える 4

10

はい、何をしているのかを知っていれば、キャッシュは問題ありません。クライアント側のキャッシュとサーバー側のキャッシュを組み合わせると、準備されたステートメントを想定どおりに再利用すると、パフォーマンスが大幅に向上します (多くの人が最も重要な部分を忘れています:D)。Connector/J プロパティのプロパティを正しく設定するだけです。

cachePrepStmts=true&useServerPrepStmts=true

私はマイクロ ベンチマークの大ファンではありませんが、ここに私の声明を裏付ける 1 つを示します (しゃれが意図されていません)。ベンチマークの興味深い部分は、サーバー側のキャッシュを有効にすると、クライアント側のキャッシュがなくても実際には速度が低下する可能性があることを示していますが、キャッシュの両方のレイヤーが有効になっており、準備されたステートメントを適切に再利用すると、実際にはかなり高速になる可能性があります。 .

于 2014-02-12T06:26:55.453 に答える
8

HikariCPの作者の 1 人です。MySQL をプリペアド ステートメント キャッシュ用に適切に構成する方法については、 HikariCP wikiを参照してください。プリペアド ステートメントのキャッシュは、SQL を劇的に高速化できます。さらに、ユーザー提供の入力を SQL の通常のステートメントに連結する場合に成功するコードへの SQL インジェクション攻撃を回避できます。 ユーザー提供の入力を含む SQL 文字列を作成しないでください。 常に準備済みステートメントを使用し、ユーザー提供の入力を置換値として設定します。

于 2014-02-13T09:37:01.370 に答える
3

設定できるプロパティは 2 つあります。

  • useServerPrepStmts- デフォルトでは、準備済みステートメントはクライアント側でエミュレートされるため、サーバー側の準備済みステートメントを有効にします。
  • cachePrepStmts- ステートメント キャッシング メカニズムを有効にする

パフォーマンス結果

cachePrepStmtsクライアント側のステートメントの場合、次のグラフに示すように、設定を有効にすることでスループットが向上します。

クライアント側のステートメント キャッシング

cachePrepStmtsまた、サーバー側ステートメントの場合、次のプロパティを有効にすることでスループットも向上します。

サーバー側のステートメント キャッシング

そのため、Statement Caching メカニズムは、クライアント側とサーバー側の両方の準備済みステートメントに対しても機能します。

単一ステートメントおよび複数ステートメントのトランザクションを使用して、MySQL 8.0.22 と 8.0.18 の両方でテストした場合、クライアント側の準備済みステートメントは、サーバー側の準備済みステートメントよりも優れたパフォーマンスを示しました。

さらに、次の構成オプションが最良の結果をもたらすようです。

useServerPrepStmts=false
cachePrepStmts=true
prepStmtCacheSize=500
prepStmtCacheSqlLimit=1024

最後の 2 つのプロパティは、多くのデータ駆動型アプリケーションにとってデフォルト値が低すぎるため、キャッシュ制限を増やすように設定されています。

于 2021-01-07T08:15:38.320 に答える
2

他のメーカーやモデルのテーブル サーバーでは、MySQL よりも JDBC プリペアド ステートメントのパフォーマンスが向上します。たとえば、Oracle は実行計画を再利用できます。

ただし、JDBC では準備済みステートメントを引き続き使用する必要があります。それらを使用する理由はたくさんあります。たとえば、変数をバインドすることによる注入抵抗があります。

于 2014-02-12T02:02:03.167 に答える