sql 预编译

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: sql 预编译

参考简书/知乎 大神回答,并截取了个人认为的重点内容:

       1.SQL预编译    

       2.数据库预编译为何能防止SQL注入

一、sql预编译:

       数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同...)。

       如果每次都需要经过上面的词法/语法解析、语句优化、制定执行计划等,则效率就明显不行了。所以预编译的优势就体现出来了。预编译语句在被MySQL编译器编译后,执行代码会被缓存下来。那么下次调用时,只要是相同的预编译语句就再不需要编译,只要将参数直接传入编译过的语句执行代码中即可。

二、实现:

       预编译语句就是将这类语句中的值用占位符替代(例如问号:?,可以视为将sql语句模板化或者说参数化一次编译、多次运行,省去了解析优化等过程。

三、sql预编译的作用:

    1. 预编译阶段可以优化 sql 的执行:预编译之后的 sql 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的sql,编译的复杂度将越大。预编译阶段可以合并多次操作为一个操作,从而提升性能。
    2. 防止SQL注入:使用预编译,而其后注入的参数将不会再进行SQL编译。也就是说其后注入进来的参数系统将不会认为它会是一条SQL命令,而默认其是一个参数,参数中的or或者and 等就不是SQL语法关键字了,而是被当做纯数据处理。

    补充:关于MySQL预编译语句超过上限的报错:

    Can’t create more than max_prepared_stmt_count statements (current value: 16382)

    MySQL中的 max_prepared_stmt_count 变量是用来控制全局最大存储的预编译语句数,参考:

    记录go数据库操作的bug——max_prepared_stmt_count,附分析过程

    MySQL 查看/设置 max_prepared_stmt_count 的值:

    show variables like '%max_prepared_stmt_count%';

    set global max_prepared_stmt_count = 65536;

    关于MySQL预编译的使用建议:

       经过实际测试,对于频繁使用的语句,使用服务端 “预编译 + 缓存效率” 还是能够得到可观的提升的。但是对于不频繁使用的语句,服务端预编译本身会增加额外的耗时,还会增加MySQL的使用内存。因此在实际开发中可以视情况定夺使用本地预编译还是服务端预编译,以及哪些sql语句不需要开启预编译等。

    相关实践学习
    如何在云端创建MySQL数据库
    开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    目录
    相关文章
    |
    SQL Oracle 关系型数据库
    SQL中,有效防止like的SQL注入,使用预编译SQL(?)写法
    SQL中,有效防止like的SQL注入,使用预编译SQL(?)写法
    178 0
    |
    5月前
    |
    SQL Java 数据库连接
    2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
    2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
    73 2
    |
    6月前
    |
    SQL 编译器 网络安全
    【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理
    【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理
    353 0
    |
    SQL 关系型数据库 MySQL
    [MySQL]——SQL预编译、动态sql
    [MySQL]——SQL预编译、动态sql
    373 0
    |
    SQL Java 开发者
    SQL预编译中order by后为什么不能参数化原因
    SQL预编译中order by后为什么不能参数化原因
    293 0
    |
    SQL XML 缓存
    mybatis之 # 与 $ 区别以及 sql 预编译
    mybatis之 # 与 $ 区别以及 sql 预编译
    591 0
    mybatis之 # 与 $ 区别以及 sql 预编译
    |
    SQL Java 数据库
    bboss数据库标签系列一 分页列表详细信息标签预编译sql查询数据
    本系列文章详细介绍bboss标签库的数据库标签具体使用方法,涉及到的功能包括: db查询(普通查询、预编译查询,分页查询),db新增、修改、删除、批处理操作(预编译)。 bboss数据库标签系列一 分页列表详细信息标签预编译sql查询数据 beaninfo标签,pager标签,list标签预编译sql获取数据功能相关属性和标签: sqlparamskey-指定将绑定变量参数存储在request 属性集中的变量名称,以便pager,beaninfo,list标签获取sql的绑定变量参数值。
    981 0
    |
    2月前
    |
    关系型数据库 MySQL 网络安全
    5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
    5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")