MySQLプリコンパイル機能

一个新手
一个新手オリジナル
2017-10-13 10:13:522252ブラウズ

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 までご連絡ください。