淺談 MySQL的預編譯

以前的一篇 Mybatis中 #{}和${}的區別 中涉及到經過 SQL預編譯和 #{} 傳值 的方式防止SQL注入。html

由此引起了想了解預編譯的想法。那麼什麼是預編譯那?sql

1、三個階段:

  1. 詞法和語義解析

  2. 優化sql語句,制定執行計劃

  3. 執行並返回結果

2、預編譯出現的緣由

  一、不少狀況下,一條SQL語句可能會反覆執行,或者每次執行的時候只有個別的值不一樣數據庫

  二、好比query的where條件的值不一樣,update的set的值不一樣,insert的values值不一樣,都會形成SQL語句的不一樣。緩存

  三、每次由於這些值的不一樣就進行詞法語義解析優化、制定執行計劃,就會很影響效率mybatis

  四、並且每每  步驟 一、2 加起來的時間比  步驟 3的時間還要長。ide

 

  這種狀況下就須要預編譯的出場了。post

 

3、預編譯

  一、預編譯:指的是數據庫驅動在發送 sql 語句和參數給 DBMS 以前對 sql 語句進行編譯,這樣 DBMS 執行 sql 時,就不須要從新編譯。優化

 

  二、預編譯的好處:spa

    一、預編譯以後的 SQL 多數狀況下能夠直接執行,DBMS 不須要再次編譯。code

    二、越複雜的SQL,編譯的複雜度將越大,預編譯階段能夠合併屢次操做爲一個操做。

    三、相同的預編譯 SQL 能夠重複利用。(把一個 SQL 預編譯後產生的 PreparedStatement 對象緩存下來,

        下次對於同一個 SQL,能夠直接使用這個緩存的 PreparedState 對象。)

    四、能夠將這類SQL語句中的值用佔位符替代,不須要每次編譯,能夠直接執行,

      只需執行的時候,直接將每次請求的不一樣的值設置到佔位符的位置。

    五、預編譯能夠視爲將sql語句模板化或者說參數化。

4、mybatis之sql動態解析以及預編譯源碼

  mybatis sql 動態解析

    mybatis 在調用 connection 進行 sql 預編譯以前,會對sql語句進行動態解析,動態解析主要包含以下的功能:

    • 佔位符的處理

    • 動態sql的處理

    • 參數類型校驗

  注: mybatis 默認狀況下,將對全部的 sql 進行預編譯。

 

參照:http://www.javashuo.com/article/p-ccoljqxp-dn.html

參照:https://www.jianshu.com/p/9972d7b33061

待續。。。。

相關文章
相關標籤/搜索