淺談 MySQL的預編譯


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

由此引發了想了解預編譯的想法。那么什么是預編譯那?

一、三個階段:

  1. 詞法和語義解析

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

  3. 執行並返回結果

二、預編譯出現的原因

  1、很多情況下,一條SQL語句可能會反復執行,或者每次執行的時候只有個別的值不同

  2、比如query的where條件的值不同,update的set的值不同,insert的values值不同,都會造成SQL語句的不同。

  3、每次因為這些值的不同就進行詞法語義解析優化、制定執行計划,就會很影響效率

  4、而且往往  步驟 1、2 加起來的時間比  步驟 3的時間還要長。

 

  這種情況下就需要預編譯的出場了。

 

三、預編譯

  1、預編譯:指的是數據庫驅動在發送 sql 語句和參數給 DBMS 之前對 sql 語句進行編譯,這樣 DBMS 執行 sql 時,就不需要重新編譯。

 

  2、預編譯的好處:

    1、預編譯之后的 SQL 多數情況下可以直接執行,DBMS 不需要再次編譯。

    2、越復雜的SQL,編譯的復雜度將越大,預編譯階段可以合並多次操作為一個操作。

    3、相同的預編譯 SQL 可以重復利用。(把一個 SQL 預編譯后產生的 PreparedStatement 對象緩存下來,

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

    4、可以將這類SQL語句中的值用占位符替代,不需要每次編譯,可以直接執行,

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

    5、預編譯可以視為將sql語句模板化或者說參數化。

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

  mybatis sql 動態解析

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

    • 占位符的處理

    • 動態sql的處理

    • 參數類型校驗

  注: mybatis 默認情況下,將對所有的 sql 進行預編譯。

 

參照:https://www.cnblogs.com/ConfidentLiu/p/7142495.html

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

待續。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM