mysql jdbc 绑定变量_「MySQL高级特性——绑定变量」- 海风纷飞Blog
从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率
介绍
当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型。服务器端收到这个SQL语句框架后,解析并存储这个SQL语句的部分执行计划,返回个客户端一个 SQL 语句处理句柄。以后每次执行这类查询,客户端都指定使用这个句柄。
绑定变量的SQL,使用问号标记可以接受参数的位置,当真正需要执行具体查询的时候,则使用具体值来替代这些问号。例如,下面是一个绑定变量的SQL语句:INSERT INTO tb1(col1, col2, col3) VALUES(?,?,?);
可以通过向服务器端发送各个问号的取值和这个SQL的句柄来执行一个具体的查询。反复使用这样的方式执行具体的查询,正是使用绑定变量的优势所在。具体如何发送取值参数和SQL句柄,这各个客户端的编程语言有关。
因为如下的原因,MySQL可以在使用绑定变量的时候高效执行大量的重复语句:在服务器端只需要执行一次SQL语句
在服务器端某些优化器的工作只需要执行一次,因为它会缓存一部分的执行计划
以二进制的方式只发送参数和句柄,比每次都发送 ASCII 码文本效率更高
仅仅是参数而不是整个查询语句,因此网络开销会更小
MySQL在存储参数的时候,直接将其存放到缓存中,不再需要在内存中多次复制
绑定变量相对也更加安全。因为无需在应用程序中处理转义,一则更加简单了,二则也大大减少了SQL诸如和攻击的风险。
绑定变量的优化
对于绑定变量的SQL,MySQL 能够缓存其部分执行计划,如果某些执行计划需要根据传入的参数来计算时,MySQL就无法缓存这部分的执行计划。根据优化器什么时候工作,可以将优化分为三类:
准备阶段
服务器解析SQL语句,移除不可能的条件并且重写子查询
在第一次执行的时候
如果可能,服务器先简化嵌套循环的关联,并将外关联转化成内关联
在每次SQL语句执行时
服务器会做如下事情:过滤分区
如果可能的话,尽可能移除COUNT()、 MIN() 和 MAX()
移除常数表达式
检测常量表
做必要的等值传播
分析和优化 ref、 range和索引优化等访问数据的方法
优化关联顺序
SQL 接口的绑定变量
在4.1 和更新版本中,MySQL 支持了SQL接口的绑定变量。不使用二进制传输协议也可以直接以SQL 的方式使用绑定变量:
SQL接口的绑定变量的最主要用途就是在存储过程中使用。在MySQL5.0 版本中,这就可以在存储过程中使用绑定变量,其语法和前面介绍的SQL接口的绑定变量类似。这意味着可以在存储过程中构建并且执行动态的SQL语句,即可以通过灵活的拼接字符串等参数构建SQL语句。
绑定变量的限制
关于绑定变量的一些限制和注意事项如下:绑定变量是会话级别的,所以链接之间不能公用绑定变量句柄。同样的,一旦连接断开,则原本的句柄也不能再使用了。(连接池和持久化连接可以在一定程度上缓解这个问题)
并不是所有的时候使用绑定变量都能获得更好的性能。如果只是执行一次的SQL,那么使用绑定变量方式无疑比直接执行多了一次额外的准备阶段消耗,而且还需要一次额外的网络开销。
绑定变量SQL总数的限制是一个全局限制,如果总是忘记释放绑定变量资源,则在服务器端很容易发生资源“泄漏”。
不过使用绑定变量最大的障碍可能是:它是如何实现以及原理是什么样的,这两点很容易让人困惑。有时候,很难解释如下三种绑定变量类型之间的区别是什么:
客户端模拟的绑定变量
客户端的驱动程序接收一个带参数的SQL,再将指定的值带入其中,最后将完整的查询发送到服务器端。
服务器端的绑定变量
客户端使用特殊的二进制协议将带参数的字符串发送到服务器端,然后使用二进制协议将具体的参数值发送给服务器端并执行。
SQL接口的绑定变量
客户端先发送一个带参数的字符串到服务器端,这类似于使用 PREPARE 的 SQL 语句,然后发送设置参数的SQL,最后使用 EXECUTE 来执行SQL。所有这些都是使用普通的文本传输协议。
mysql jdbc 绑定变量_「MySQL高级特性——绑定变量」- 海风纷飞Blog相关推荐
- centos7查看当前端口_「Centos7开放及查看端口」- 海风纷飞Blog
1.开放端口 firewall-cmd --zone=public --add-port=5432/tcp --permanent # 开放5432端口 firewall-cmd --zone=pu ...
- docker项目部署 php_「Docker部署PHP+Vue项目」- 海风纷飞Blog
创建Docker映射目录-- vue_demo # Demo项目 -- php_vue -- docker-compose.yaml -- nginx ---- apps ...
- mysql支持事务的储存引擎_「mysql事务与mysql储存引擎」- 海风纷飞Blog
事务概念及存储引擎 1.0 为何要事务? 先来看一个场景,银行转账汇款: 李彦宏和周鸿祎天天打架,现在让李彦宏给周鸿祎转款1000 元 设计如下表 account表 编号(id)用户名(user)金额 ...
- laravel services.php,「Laravel框架中使用Service模式」- 海风纷飞Blog
若将商业逻辑都写在controller,会造成controller肥大而难以维护,基于SOLID原则,我们应该使用Service模式辅助controller,将相关的商业逻辑封装在不同的service ...
- 上海时间戳 php,「PHP的时间戳与具体时间转化」- 海风纷飞Blog
三个内置函数:time() //获取UNIX系统时间戳 mktime(hour,minute,second,month,day,year) //将指定时间转化为时间戳 date(时间格式,时间戳 ...
- mysql所选路径已经存在_「mysql第二次安装不了」mysql安装失败怎么清理干净?
很多朋友装mysql数据库时出现无法安装的情况,更可怕的是删除相关文件仍然无法安装,很伤脑筋,相信很多朋友都有过这种经历. 其实导致数据无法安装的原因大多数是因为之前安装的Mysql数据没有卸载干净, ...
- mysql创建全外连接的视图_「MySql学习」Mysql学习系列之常用数据库查询语句
一.简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的表或视图.以及搜索条件等.10.5pt;font-family:"A ...
- mysql jdbc 驱动名称_【经验分享】常用 JDBC 驱动名字和 URL 列表
ODBC driver sun.jdbc.odbc.JdbcOdbcDriver jdbc:odbc:name 用 COM.ibm.db2.jdbc.net.DB2Driver 连接到 DB2 数据 ...
- mysql刷新当前数据库_看看MySQL数据库高级操作
免费资源网 - https://freexyz.cn/ 文章目录 数据表高级操作 准备工作:安装MySQL数据库 一.克隆表 方法一 方法二 二.清空表,删除表内的所有数据 方法一 方法二 三.创建临 ...
- mysql outfile 变量_转mysql dumpfile 与 outfile 函数的区别
一直以为两个函数作用是相同的 经过简单测试发现还是有些区别的 如下表admin mysql select * from admin; +-----+-----------+---------+ | u ...
最新文章
- RPC(远程过程调用协议)介绍
- CDOJ 1073 线段树 单点更新+区间查询 水题
- 这两年:我的数据竞赛之路
- python一个月能学成嘛-0基础学Python,1个月写爬虫,走了哪些弯路?
- 源码注释TODO/ FIXME/XXX,
- 怎样将压缩文件上传到服务器上
- js调用php和php调用js的方法举例
- c#跨线程操作控件(有UI操作)|及多线程操作
- YII 增加登陆认证
- Spring Boot集成Redis缓存之模拟高并发场景处理
- MySQL数据库事物隔离级别
- python中dtypes_Dataframe创建及index,columns,values,dtypes等属性介绍
- 编程题:字符串的指针引用。用指针法实现。功能:将字符串str2复制连接到str1...
- Python返回多个值
- 吴恩达机器学习课程笔记
- 从Python.org下载Python安装包下载很慢
- linux多线程编程介绍
- Junit单元测试的基本编码步骤
- Python手册(Machine Learning)--statsmodels(Regression)
- 面试题总结-搜狐手机网Python开发工程师
热门文章
- 明尼苏达大学双城分校计算机科学,UMN的Computer Science Engineering「明尼苏达大学双城分校计算机科学与工程系」...
- mitmproxy监听数据请求并处理数据
- 为什么说人脸识别门禁是智慧社区的优选?
- 如何向公众号添加的H5页面的链接(已解决)
- U盘winpe启动盘的制作
- 卡斯卡迪亚社区建设者奖:2017年获胜者公布
- 基于层次分析法(AHP)的信贷案例详解
- 昨天买的电动车今天上牌了
- 服务器磁盘配置信息,服务器磁盘阵列配置
- python 单位根检验代码_Python中ADF单位根检验实现查看结果的方法