1 つの記事で MySQL のプリコンパイルを理解する

1 つの記事で MySQL のプリコンパイルを理解する

1. プリコンパイルの利点

私たちは皆、プリコンパイル機能を備えた JDBC の PreparedStatement インターフェイスを使用したことがあります。プリコンパイル機能とは何ですか?それのメリットは何ですか?

クライアントが SQL ステートメントをサーバーに送信すると、サーバーは常に SQL ステートメントの構文が正しいかどうかを確認し、SQL ステートメントを実行可能な関数にコンパイルし、最後に SQL ステートメントを実行する必要があります。構文チェックとコンパイルにかかる時間は、SQL ステートメントの実行にかかる時間よりも長くなる可能性があります。

複数の挿入文を実行する必要があるが、挿入される値が毎回異なる場合、MySQL サーバーは SQL 文の構文形式も確認して毎回コンパイルする必要があり、時間がかかりすぎます。プリコンパイル機能を使用すると、SQL 文は一度だけ構文チェックされ、コンパイルされるため、効率が高くなります。

2. MySQLはプリコンパイルを実行する

MySQL は、次の 3 つのステップでプリコンパイルを実行します。

  • 準備されたステートメントを実行します。例: prepare myfun from 'select * from t_book where bid=?'
  • 変数を設定します。例: set @str='b1'
  • ステートメントを実行します。例: execute myfun using @str

myfun を再度実行する必要がある場合、最初の手順を実行する必要はありません。つまり、ステートメントを再度コンパイルする必要はありません。

  • 変数を設定します。例: set @str='b2'
  • ステートメントを実行します。例: execute myfun using @str

MySQL ログを表示すると、実行プロセスを確認できます。

3. ステートメントを使用してプリコンパイルを実行する

ステートメントを使用してプリコンパイルを実行すると、上記の SQL ステートメントが 1 回実行されます。

接続 con = JdbcUtils.getConnection();
ステートメント stmt = con.createStatement();
stmt.executeUpdate("'select * from t_book where bid=?' から myfun を準備します");
stmt.executeUpdate("@str='b1' を設定");
ResultSet rs = stmt.executeQuery("@str を使用して myfun を実行します");
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

stmt.executeUpdate("@str='b2' を設定");
rs = stmt.executeQuery("@str を使用して myfun を実行します");

while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
stmt.close();
con.close();

4. useServerPrepStmtsパラメータ

デフォルトでは、PreparedStatement はプリコンパイルに使用できません。URL に useServerPrepStmts=true パラメータを指定する必要があります (MySQL Server 4.1 より前のバージョンではプリコンパイルがサポートされておらず、Connector/J 5.0.5 以降のバージョンではデフォルトでプリコンパイルが有効になっていません)。

例: jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

これにより、MySQL ドライバーは最初に SQL ステートメントをプリコンパイルのためにサーバーに送信し、次に executeQuery() を実行するときにパラメーターのみをサーバーに送信するようになります。

接続 con = JdbcUtils.getConnection();
文字列 sql = "select * from t_book where bid=?";
準備されたステートメント pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
結果セット rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

5. cachePrepStmtsパラメータ

異なる PreparedStatement オブジェクトを使用して同じ SQL ステートメントを実行すると、ステートメントは 2 回コンパイルされます。これは、ドライバーがコンパイルされた関数キーをキャッシュしないため、2 回目のコンパイルが発生するためです。コンパイルされた関数のキーをキャッシュする場合は、cachePrepStmts パラメータを true に設定します。例えば:

jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true

接続 con = JdbcUtils.getConnection();
文字列 sql = "select * from t_book where bid=?";
準備されたステートメント pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
結果セット rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

pstmt = con.prepareStatement(sql);
pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

6. バッチ処理をオンにする

MySQL バッチ処理もパラメータを通じて有効にする必要があります。

rewriteBatchedStatements=true

上記は、MySQL プリコンパイルを 1 つの記事で理解するための詳細な内容です。MySQL プリコンパイルの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLプリコンパイル機能の詳細な説明
  • mysqliの前処理コンパイルの詳細な理解
  • ソースコードから MySQL 8.0.20 をコンパイルしてインストールする詳細なチュートリアル
  • CentOS8 デプロイメント LNMP 環境で mysql8.0.29 をコンパイルしてインストールする方法の詳細なチュートリアル
  • Linux で cmake を使用して MySQL をコンパイルおよびインストールするための詳細なチュートリアル

<<:  webpack-dev-server のコア概念とケースの詳細な説明

>>:  CentOS 7 で Apache (httpd) サービスをインストールおよびアンインストールする詳細な手順

推薦する

Alibaba Cloud Server Ubuntu 設定チュートリアル

Alibaba Cloud のカスタム Ubuntu イメージのインポートには、OSS スナップショ...

MySQLでよく使われる演算子と関数の概要

まずデータ テーブルを作成しましょう。 使用テスト; テーブル「従業員」を作成します( emp_no...

Navicat 経由で MySQL にリモート接続する方法

Navicat を使用して IP 経由で直接接続すると、次のようなさまざまなエラーが報告されます: ...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

Webスキル: 複数のIEバージョンの共存ソリューション IETester

私のおすすめ複数のIEバージョンの共存のためのソリューション以前に IE6、IE7、IE8 の共存に...

Angularルーティングの基礎の詳細な説明

目次1. ルーティング関連オブジェクト2. ルーティングオブジェクトの場所3. ルーティング構成4....

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

MySQL共通インデックスとユニークインデックスの選択に関する詳細な分析

各人が固有の携帯電話番号で登録し、ビジネス コードによって重複する携帯電話番号が 2 つ書き込まれな...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

ネイティブJSで実装されたギャラリー機能

目次最初2番目Native Js はギャラリー機能を実装します。画像をクリックすると、対応する拡大画...

PHP 開発環境の構築に関する win10 docker-toolsbox チュートリアル

画像をダウンロード docker プル mysql:5.7 docker pull php:7.2-...

VueのSSRサーバーサイドレンダリング例の詳細な説明

サーバーサイドレンダリング (SSR) を使用する理由検索エンジンのクローラーが完全にレンダリングさ...

nginxを使用して画像サイズを動的に変換し、サムネイルを生成します。

Nginx ngx_http_image_filter_module モジュール (nginx バ...

VMware仮想マシンブリッジによるインターネット相互接続を実現する方法

VMware をインストールして新しい仮想マシンを作成したら、オプション バーの [編集] - [仮...

MySQLの基本操作を詳しく解説(第2部)

序文この記事には1. データベースのいくつかの主要な制約2. テーブル間の関係制約:主キー制約: 機...