Heim  >  Artikel  >  Datenbank  >  MySQL-Vorkompilierungsfunktion

MySQL-Vorkompilierungsfunktion

一个新手
一个新手Original
2017-10-13 10:13:522160Durchsuche

1. Vorteile der Vorkompilierung

Normalerweise hat jeder die PreparedStatement-Schnittstelle in JDBC verwendet, die über eine Vorkompilierungsfunktion verfügt. Was ist die Vorkompilierungsfunktion? Was sind seine Vorteile?

Wenn der Client eine SQL-Anweisung an den Server sendet, muss der Server immer überprüfen, ob das Syntaxformat der SQL-Anweisung korrekt ist, dann die SQL-Anweisung in eine ausführbare Funktion kompilieren und schließlich die SQL-Anweisung ausführen . Der Zeitaufwand für die Überprüfung und Kompilierung der Syntax kann höher sein als der Zeitaufwand für die Ausführung von SQL-Anweisungen.

Wenn wir mehrere Einfügeanweisungen ausführen müssen, aber nur die eingefügten Werte jedes Mal unterschiedlich sind, muss der MySQL-Server jedes Mal auch das Syntaxformat der SQL-Anweisung überprüfen und kompilieren, was ebenfalls Verschwendung ist viel Zeit. Wenn Sie die Vorkompilierungsfunktion verwenden, wird die SQL-Anweisung nur einmal syntaktisch überprüft und kompiliert, sodass die Effizienz hoch ist.

2. MySQL führt die Vorkompilierung durch

MySQL führt die Vorkompilierung in drei Schritten durch:

  • Führen Sie vorkompilierte Anweisungen aus, zum Beispiel: Prepare myfun from 'select * from t_book where bid=?'

  • Variablen festlegen, zum Beispiel: set @str='b1'

  • Anweisungen ausführen, zum Beispiel :execute myfun mit @str

Wenn Sie myfun erneut ausführen müssen, ist der erste Schritt nicht mehr erforderlich, d. h. es ist nicht erforderlich, die Anweisung zu kompilieren:

  • Variablen festlegen, zum Beispiel: set @str='b2'

  • Anweisungen ausführen, zum Beispiel: myfun mit @str ausführen

Pass Überprüfen Sie das MySQL-Protokoll, um den Ausführungsprozess zu sehen:

3. Verwenden Sie die Anweisung, um die Vorkompilierung durchzuführen

Anweisung zum Ausführen der Vorkompilierung verwenden, um die obige SQL-Anweisung einmal auszuführen.


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-Parameter

Die Vorkompilierung kann standardmäßig nicht mit PreparedStatement durchgeführt werden. Dazu muss der Parameter useServerPrepStmts=true in der URL angegeben werden (Versionen vor MySQL Server 4.1 unterstützen keine Vorkompilierung und Versionen von Connector/J nach 5.0.5 aktivieren die Vorkompilierungsfunktion standardmäßig nicht).

Zum Beispiel: jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

Dadurch kann sichergestellt werden, dass der MySQL-Treiber zuerst die SQL-Anweisung zur Vorkompilierung an den Server sendet und dann ausführenexecuteQuery() sendet nur die Parameter an den Server.


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-Parameter

Wenn Sie verschiedene PreparedStatement-Objekte verwenden, um dieselbe SQL-Anweisung auszuführen, tritt immer noch das Phänomen auf, dass es zweimal kompiliert wird. Dies liegt daran, dass der Treiber die kompilierte Funktionstaste nicht zwischenspeichert, was zu einer sekundären Kompilierung führt. Wenn Sie den Schlüssel der kompilierten Funktion zwischenspeichern möchten, müssen Sie den Parameter „cachePrepStmts“ auf „true“ setzen. Zum Beispiel:

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 🎜 >

Die Stapelverarbeitung von MySQL muss auch über die Parameter aktiviert werden: rewriteBatchedStatements=true

Das obige ist der detaillierte Inhalt vonMySQL-Vorkompilierungsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn