zoukankan      html  css  js  c++  java
  • 浅谈 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

    待续。。。。

  • 相关阅读:
    iOS 基础复习
    iOS项目立项
    Cocos2d-JS项目之四:UI界面的优化
    Cocos2d-JS项目之三:使用合图
    Cocos2d-JS项目之二:studio基础控件的使用
    Cocos2d-JS项目之一:环境(IDE 运行js-tests、IDE 和 studio 统一工程)
    字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃
    cocos2dx 2.x 骨骼动画优化
    Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)
    [leetcode 周赛 160] 1240 铺瓷砖
  • 原文地址:https://www.cnblogs.com/mww-NOTCOPY/p/11789011.html
Copyright © 2011-2022 走看看