MySQLプリコンパイル機能の詳細な説明

MySQLプリコンパイル機能の詳細な説明

この記事では、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 より前のバージョンではプリコンパイルがサポートされておらず、5.0.5 以降の Connector/J バージョンではデフォルトでプリコンパイルが有効になっていません。

例: 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

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  CentOS での Docker の詳細なインストール チュートリアル

>>:  CocosCreator で http と WebSocket を使用する方法

推薦する

CentOS での mysql5.7 の詳細なインストールと設定のチュートリアル

インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...

Vue 2.0 の基礎を詳しく解説

目次1. 特徴2. 例3. オプション4. 基本的な文法5. ライフサイクル6. ルーティング管理 ...

HTML Web ページにおける URL の表現

HTML では、一般的な URL はさまざまな方法で表現されます。相対 URL:コードをコピーコード...

JavaScriptはキャンバスを使用して座標と線を描画します

この記事では、JavaScriptでキャンバスを使用して座標と線を描く具体的なコードを参考までに紹介...

inline-blockプロパティとの互換性

<br />1年前、インターネット上にはinline-blockプロパティに関する記事は...

Innodb で MySQL の 2T テーブルをすばやく削除する方法の例

序文この記事は主に、MySQL の Innodb で 2T の大きなテーブルをすばやく削除する方法に...

MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法の詳細な説明

High Performance MySQL バージョン 3 (セクション 4.1.7) を見ると、...

一般的なDockerコマンドの詳細な説明

1. ヘルプコマンド1. 現在のDockerバージョンを表示する docker バージョン2. イメ...

MySQL サービス 1067 エラーの解決策: mysql 実行可能ファイルのパスを変更する

今日、MySQLサービス1067エラー問題に遭遇しました。システムアカウントを使用するように設定して...

Linux での MySQL 5.6.27 インストール チュートリアル

この記事では、LinuxでのMySQL 5.6.27のインストールチュートリアルを参考までに紹介しま...

ウェブページにコンテンツが多すぎる場合に、下から上へ素早く戻る方法

Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...

回転するフリップカードアニメーションの効果を実現するCSS

回転フリップ効果の CSS アニメーション、具体的な内容は次のとおりです。 1. まず2つのボックス...

IE ブラウザの HTML ハック タグの概要

コードをコピーコードは次のとおりです。 <!--[if !IE]><!-->...

RedHat 6.5 に MySQL 5.7 をインストールするための詳細なチュートリアル

RedHat6.5インストールMySQL5.7チュートリアル共有、参考までに、具体的な内容は次のとお...

webpackでCSSを分割・圧縮し、リンクでインポートする手順

まずコードファイルの構造を見てみましょう。エントリファイル (index1.js) の内容: ...