一文搞懂MySQL預編譯_Mysql

來源:腳本之家  責任編輯:小易  

玩Oracle的都比較關注shared pool,特別是library cache,在使用了綁定變量(預編譯sql)之后確實能得到很大的性能提升,F在在轉Mysql之后特別是innodb很多東西都還能和Oracle對得上號的,就像innodb_buffer_pool_size類似于Oracle的database buffer cache,innodb_log_buffer_size類似于redo log buffer,但是innodb_additional_mem_pool_size僅僅類似于shared pool的Data dictionary cache,似乎還缺少和library cache相對應的東西。那就有一個問題了,在Mysql里面使用預編譯的sql還會有性能提升嗎?這里我用Java的jdbc做了一下測試,分別用Statement和PreparedStatement執行1000個sql,并運行10次1.使用Statement做硬解析:1 package exmysql;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.sql.Statement;8 import java.util.Date;9 10 public class adddata {11 12 private static long worker(){13 Date begin=new Date();14 15 String driver="com.mysql.jdbc.Driver";16 17 String url="jdbc:mysql:/172.16.2.7:3306/testdb;18 19 Connection conn=null;20 Statement stmt=null;21 ResultSet rs=null;22 23 try{24 Class.forName(driver);25 conn=DriverManager.getConnection(url,"dbaadminwww.anxorj.tw防采集請勿采集本網。

1、預編譯的好處

mysql 預編譯 為什么默認不開啟 當然如果開啟預編譯功能的話,還要開啟客戶端緩存功能,否則有害無利。但是即使開了預編譯功能也不會對程序帶來多大改進,因為mysql的服務端預編譯是session級別

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

內容: Connection conn=ConnectionObject.getConnection();String insql=\"insert into students(sid,sname,sex,age,address,tel)values?if(conn!null){ try { sta=conn.createStatement();ps=conn.

  當客戶發送一條SQL語句給服務器后,服務器總是需要校驗SQL語句的語法格式是否正確,然后把SQL語句編譯成可執行的函數,最后才是執行SQL語句。其中校驗語法,和編譯所花的時間可能比執行SQL語句花的時間還要多。

[email protected]_stmt=''/*在單引號中間填入要執行的sql語句*/ PREPARE stmt [email protected]_stmt;EXECUTE stmt;DEALLOCATE PREPARE stmt;

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

在Java編程中,應用代碼絕大多數使用了PreparedStatement,無論你是直接使用JDBC還是使用框架。在Java編程中,絕大多數使用了使用了PreparedStatement連接MySQL的應用代碼沒有啟用預編譯,無論你是

2、MySQL執行預編譯

(簡單又有效的方法)PreparedStatement 采用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。使用好處: (1).代碼的可讀性和可維護性. (2).PreparedStatement盡最大

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預編譯的資料請關注真格學網其它相關文章!

mysql和SqlServer是一樣的,只不過調用的代碼不一樣,mysql的調用如下:call 存儲過程名稱;內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • mysql預編譯功能詳解
  • mysqli預處理編譯的深入理解
  • 源碼編譯安裝mysql8.0.20的詳細教程
  • centos8部署lnmp環境之編譯安裝mysql8.0.29的教程詳解
  • linux下使用cmake編譯安裝mysql的詳細教程
  • 如何通過sql找出2個表里值不同的列的方法
  • mysql獲取所有分類的前n條記錄
  • 快速修復損壞的mysql數據庫
  • windows(x86,64bit)升級mysql 5.7.17免安裝版的詳細教程
  • mysql 5.7.17 免安裝版配置方法圖文教程(windows10)
  • 解決mysql與navicat建立連接出現1251錯誤
  • centos中徹底刪除mysql(rpm、yum安裝的情況)
  • centos 6.5下安裝mysql 5.6教程
  • 安裝和使用percona-toolkit來輔助操作mysql的基本教程
  • mysql error 1044 (42000): access denied for user ''''@''loca
  • 為什么很多人不用MySQL預編譯查詢
  • mysql怎么實現預編譯
  • mysql 預編譯語句被哪個連接持有
  • 如何關閉mysql指定功能的預編譯功能
  • mysql 預編譯 為什么默認不開啟
  • mysql,批量插入的時候能不能用預編譯該如何解決
  • Mysql怎么確定儲存過程是預編譯的比普通sql執行的快
  • sql server的預編譯功能默認是開啟的嗎
  • 服務器被sql注入,有沒有什么解決方法?
  • linux 做LAMP MYSQL 編譯安裝沒搞明白 -with 這些是什么意思在那里找到的 于是我就RPM 安裝了MYSQL
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁mysql預編譯功能詳解mysqli預處理編譯的深入理解源碼編譯安裝mysql8.0.20的詳細教程centos8部署lnmp環境之編譯安裝mysql8.0.29的教程詳解linux下使用cmake編譯安裝mysql的詳細教程如何通過sql找出2個表里值不同的列的方法mysql獲取所有分類的前n條記錄快速修復損壞的mysql數據庫windows(x86,64bit)升級mysql 5.7.17免安裝版的詳細教程mysql 5.7.17 免安裝版配置方法圖文教程(windows10)解決mysql與navicat建立連接出現1251錯誤centos中徹底刪除mysql(rpm、yum安裝的情況)centos 6.5下安裝mysql 5.6教程安裝和使用percona-toolkit來輔助操作mysql的基本教程mysql error 1044 (42000): access denied for user """"@""locamysql安裝圖解 mysql圖文安裝教程can""""t connect to mysql servwindows下mysql5.6版本安裝及配置mysql字符串截取函數substring的mysql創建用戶與授權方法mysql提示:the server quit withmysql——修改root密碼的4種方法mysql日期數據類型、時間類型使用mysql update語句的用法詳解mysql 的case when 語句使用說明mysql模式 strict mode知識點詳解vs2013連接mysql5.6成功案例一枚sysbench多線程性能測試工具基于mysql查詢語句的使用詳解mysql5.7.18主從復制搭建(一主一從)教程詳mysql 8.0.15 安裝配置圖文教程centos 6.5下 mysql-community-server. 5mysql事務隔離級別之讀提交詳解mysql 5.7.18 安裝教程及問題匯總淺談mysql中group_concat()函數的排序方法
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载