1、預編譯的好處
大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?
當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編譯所花的時間可能比執行sql語句花的時間還要多。
如果我們需要執行多次insert語句,但只是每次插入的值不同,mysql伺服器也是需要每次都去校驗sql語句的語法格式,以及編譯,這就浪費了太多的時間。如果使用預編譯功能,那麼只對sql語句進行一次語法校驗和編譯,所以效率要高。
2、mysql執行預編譯
mysql執行預編譯分為如三步:
執行預編譯語句,例如: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、使用statement執行預編譯
使用statement執行預編譯就是把上面的sql語句執行一次。
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/j在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語句時,還是會出現編譯兩次的現象,這是因為驅動沒有快取編譯後的函式key,導致二次編譯。如果希望快取編譯後函式的key,那麼就要設定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怎麼實現預編譯 MySQL預編譯功能詳解
1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...
mysql 預編譯 MySQL預編譯功能詳解
1 預編譯的好處 大家平時都使用過jdbc中的preparedstatement介面,它有預編譯功能。什麼是預編譯功能呢?它有什麼好處呢?當客戶傳送一條sql語句給伺服器後,伺服器總是需要校驗sql語句的語法格式是否正確,然後把sql語句編譯成可執行的函式,最後才是執行sql語句。其中校驗語法,和編...
MySQL的預編譯
1 很多情況下,一條sql語句可能會反覆執行,或者每次執行的時候只有個別的值不同 2 比如query的where條件的值不同,update的set的值不同,insert的values值不同,都會造成sql語句的不同。3 每次因為這些值的不同就進行詞法語 析 優化 制定執行計畫,就會很影響效率。4 而...