濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > 一文搞懂MySQL預(yù)編譯

一文搞懂MySQL預(yù)編譯

熱門標(biāo)簽:上海市三維地圖標(biāo)注 電話機(jī)器人是電腦呼號(hào)嗎 南寧外呼系統(tǒng)招商 怎么更改高德地圖標(biāo)注 機(jī)器人打電銷電話 云南大數(shù)據(jù)外呼系統(tǒng) 400電話到哪辦理優(yōu)惠 博樂電銷機(jī)器人 鄭州網(wǎng)絡(luò)外呼系統(tǒng)價(jià)錢

1、預(yù)編譯的好處

  大家平時(shí)都使用過JDBC中的PreparedStatement接口,它有預(yù)編譯功能。什么是預(yù)編譯功能呢?它有什么好處呢?

  當(dāng)客戶發(fā)送一條SQL語句給服務(wù)器后,服務(wù)器總是需要校驗(yàn)SQL語句的語法格式是否正確,然后把SQL語句編譯成可執(zhí)行的函數(shù),最后才是執(zhí)行SQL語句。其中校驗(yàn)語法,和編譯所花的時(shí)間可能比執(zhí)行SQL語句花的時(shí)間還要多。

  如果我們需要執(zhí)行多次insert語句,但只是每次插入的值不同,MySQL服務(wù)器也是需要每次都去校驗(yàn)SQL語句的語法格式,以及編譯,這就浪費(fèi)了太多的時(shí)間。如果使用預(yù)編譯功能,那么只對(duì)SQL語句進(jìn)行一次語法校驗(yàn)和編譯,所以效率要高。 

2、MySQL執(zhí)行預(yù)編譯

MySQL執(zhí)行預(yù)編譯分為如三步:

  • 執(zhí)行預(yù)編譯語句,例如:prepare myfun from 'select * from t_book where bid=?'
  • 設(shè)置變量,例如:set @str='b1'
  • 執(zhí)行語句,例如:execute myfun using @str

如果需要再次執(zhí)行myfun,那么就不再需要第一步,即不需要再編譯語句了:

  • 設(shè)置變量,例如:set @str='b2'
  • 執(zhí)行語句,例如:execute myfun using @str

通過查看MySQL日志可以看到執(zhí)行的過程:

3、使用Statement執(zhí)行預(yù)編譯

使用Statement執(zhí)行預(yù)編譯就是把上面的SQL語句執(zhí)行一次。

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參數(shù)

  默認(rèn)使用PreparedStatement是不能執(zhí)行預(yù)編譯的,這需要在url中給出useServerPrepStmts=true參數(shù)(MySQL Server 4.1之前的版本是不支持預(yù)編譯的,而Connector/J在5.0.5以后的版本,默認(rèn)是沒有開啟預(yù)編譯功能的)。

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

  這樣才能保證mysql驅(qū)動(dòng)會(huì)先把SQL語句發(fā)送給服務(wù)器進(jìn)行預(yù)編譯,然后在執(zhí)行executeQuery()時(shí)只是把參數(shù)發(fā)送給服務(wù)器。

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參數(shù)

  當(dāng)使用不同的PreparedStatement對(duì)象來執(zhí)行相同的SQL語句時(shí),還是會(huì)出現(xiàn)編譯兩次的現(xiàn)象,這是因?yàn)轵?qū)動(dòng)沒有緩存編譯后的函數(shù)key,導(dǎo)致二次編譯。如果希望緩存編譯后函數(shù)的key,那么就要設(shè)置cachePrepStmts參數(shù)為true。例如:

  jdbc:mysql://localhost:3306/test?useServerPrepStmts=truecachePrepStmts=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的批處理也需要通過參數(shù)來打開:

rewriteBatchedStatements=true

以上就是一文搞懂MySQL預(yù)編譯的詳細(xì)內(nèi)容,更多關(guān)于MySQL預(yù)編譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL預(yù)編譯功能詳解
  • mysqli預(yù)處理編譯的深入理解
  • 源碼編譯安裝MySQL8.0.20的詳細(xì)教程
  • CentOS8部署LNMP環(huán)境之編譯安裝mysql8.0.29的教程詳解
  • linux下使用cmake編譯安裝mysql的詳細(xì)教程

標(biāo)簽:益陽 定西 白銀 杭州 恩施 秦皇島 寧夏 澳門

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《一文搞懂MySQL預(yù)編譯》,本文關(guān)鍵詞  一文,搞懂,MySQL,預(yù),編譯,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《一文搞懂MySQL預(yù)編譯》相關(guān)的同類信息!
  • 本頁收集關(guān)于一文搞懂MySQL預(yù)編譯的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    三明市| 乌鲁木齐县| 东乌| 峨边| 夏河县| 科技| 太保市| 武山县| 都匀市| 红安县| 额尔古纳市| 晋中市| 涟源市| 凌海市| 噶尔县| 洞头县| 中山市| 鹰潭市| 琼中| 砀山县| 修水县| 阳春市| 略阳县| 大埔区| 呼图壁县| 莲花县| 永康市| 岱山县| 普兰店市| 婺源县| 德惠市| 深州市| 奇台县| 郁南县| 从化市| 铅山县| 大名县| 花垣县| 通渭县| 平乡县| 从江县|