MySQLプリコンパイル機能

Oct 13, 2017 am 10:13 AM
mysql 関数 コンパイル

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

誰もが通常、プリコンパイル機能を持​​つ JDBC の PreparedStatement インターフェイスを使用したことがあります。プリコンパイル機能とは何ですか?その利点は何ですか?

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

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

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

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

  • プリコンパイルされたステートメントを実行します。例: prepare myfun from 'select * from t_book where bid=?'

  • 例: set @str='b1'

  • ステートメントを実行します。例: @str

を使用してmyfunを実行します。myfunを再度実行する必要がある場合、最初のステップは不要になります。ステートメントを再度コンパイルするには:

  • 変数を設定します。例: set @str='b2'

  • ステートメントを実行します。例: @str

を使用して myfun を実行します。 MySQL ログ:

3. Statement を使用してプリコンパイルを実行します

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


Connection con = JdbcUtils.getConnection();
Statement stmt = con.createStatement();
stmt.executeUpdate("prepare myfun from 'select * from t_book where bid=?'");
stmt.executeUpdate("set @str='b1'");
ResultSet rs = stmt.executeQuery("execute myfun using @str");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("set @str='b2'");
rs = stmt.executeQuery("execute myfun using @str");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/JIn バージョンは5.0.5 以降、プリコンパイル機能はデフォルトでは有効になっていません)。

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

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


Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet 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 回行われるという現象が引き続き発生します。 。コンパイルされた関数のキーをキャッシュしたい場合は、cachePrepStmts パラメーターを true に設定する必要があります。例:

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


Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet 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プリコンパイル機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのビッグデータ構造処理スキル PHPのビッグデータ構造処理スキル May 08, 2024 am 10:24 AM

ビッグ データ構造の処理スキル: チャンキング: データ セットを分割してチャンクに処理し、メモリ消費を削減します。ジェネレーター: データ セット全体をロードせずにデータ項目を 1 つずつ生成します。無制限のデータ セットに適しています。ストリーミング: ファイルやクエリ結果を 1 行ずつ読み取ります。大きなファイルやリモート データに適しています。外部ストレージ: 非常に大規模なデータ セットの場合は、データをデータベースまたは NoSQL に保存します。

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

MySQL クエリのパフォーマンスは、検索時間を線形の複雑さから対数の複雑さまで短縮するインデックスを構築することで最適化できます。 PreparedStatement を使用して SQL インジェクションを防止し、クエリのパフォーマンスを向上させます。クエリ結果を制限し、サーバーによって処理されるデータ量を削減します。適切な結合タイプの使用、インデックスの作成、サブクエリの使用の検討など、結合クエリを最適化します。クエリを分析してボトルネックを特定し、キャッシュを使用してデータベースの負荷を軽減し、オーバーヘッドを最小限に抑えます。

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

MySQLテーブルにデータを挿入するにはどうすればよいですか?データベースに接続する: mysqli を使用してデータベースへの接続を確立します。 SQL クエリを準備します。挿入する列と値を指定する INSERT ステートメントを作成します。クエリの実行: query() メソッドを使用して挿入クエリを実行します。成功すると、確認メッセージが出力されます。

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

PHP で MySQL ストアド プロシージャを使用するには: PDO または MySQLi 拡張機能を使用して、MySQL データベースに接続します。ストアド プロシージャを呼び出すステートメントを準備します。ストアド プロシージャを実行します。結果セットを処理します (ストアド プロシージャが結果を返す場合)。データベース接続を閉じます。

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

PHP を使用して MySQL テーブルを作成するには、次の手順が必要です。 データベースに接続します。データベースが存在しない場合は作成します。データベースを選択します。テーブルを作成します。クエリを実行します。接続を閉じます。

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

MySQL 8.4 (2024 年時点の最新の LTS リリース) で導入された主な変更の 1 つは、「MySQL Native Password」プラグインがデフォルトで有効ではなくなったことです。さらに、MySQL 9.0 ではこのプラグインが完全に削除されています。 この変更は PHP および他のアプリに影響します

GateToken(GT)通貨とは何ですか? GT コインの機能とトークンエコノミクスの紹介 GateToken(GT)通貨とは何ですか? GT コインの機能とトークンエコノミクスの紹介 Jul 15, 2024 pm 04:36 PM

GateToken(GT)通貨とは何ですか? GT (GateToken) は、GateChain チェーンのネイティブ資産であり、Gate.io の公式プラットフォーム通貨です。 GT コインの価値は、Gate.io および GateChain エコロジーの発展と密接に関連しています。ゲートチェーンとは何ですか? GateChain は 2018 年に誕生し、Gate.io によって開始された新世代の高性能パブリック チェーンです。 GateChain は、ユーザーのオンチェーン資産のセキュリティを保護し、便利な分散トランザクション サービスを提供することに重点を置いています。 GateChain の目標は、エンタープライズレベルの安全で効率的な分散型デジタル資産ストレージ、配信、およびトランザクションのエコシステムを構築することです。ゲートチェーンにはオリジナルがあります

See all articles