从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率

介绍

当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型。服务器端收到这个SQL语句框架后,解析并存储这个SQL语句的部分执行计划,返回个客户端一个 SQL 语句处理句柄。以后每次执行这类查询,客户端都指定使用这个句柄。

绑定变量的SQL,使用问号标记可以接受参数的位置,当真正需要执行具体查询的时候,则使用具体值来替代这些问号。例如,下面是一个绑定变量的SQL语句:

INSERT INTO tb1(col1, col2, col3) VALUES(?,?,?);

可以通过向服务器端发送各个问号的取值和这个SQL的句柄来执行一个具体的查询。反复使用这样的方式执行具体的查询,正是使用绑定变量的优势所在。具体如何发送取值参数和SQL句柄,这各个客户端的编程语言有关。

因为如下的原因,MySQL可以在使用绑定变量的时候高效执行大量的重复语句:

  1. 在服务器端只需要执行一次SQL语句
  2. 在服务器端某些优化器的工作只需要执行一次,因为它会缓存一部分的执行计划
  3. 以二进制的方式只发送参数和句柄,比每次都发送 ASCII 码文本效率更高
  4. 仅仅是参数而不是整个查询语句,因此网络开销会更小
  5. 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高级特性——绑定变量的更多相关文章

  1. mysql笔记04 MySQL高级特性

    MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...

  2. 干货:鲜为人用的MySQL高级特性与玩法!

    上一篇文章<万字总结:学习MySQL优化原理,这一篇就够了!>文末给大家留有两个开放的问题: 有非常多的程序员在分享时都会抛出这样一个观点:尽可能不要使用存储过程,存储过程非常不容易维护, ...

  3. 【MySQL高级特性】高性能MySQL第七章

    2017-07-25 14:15:43 前言:MYSQL从5.0和5.1版本开始引入了很多高级特性,例如分区.触发器等,这对有其他关系型数据库使用 背景的用户来说可能并不陌生.这些新特性吸引了很多用户 ...

  4. 7、mysql高级特性

    7.1.分区表 7.1.1 分区表的原理 7.1.2分区表的类型 7.1.3如何使用分区表 7.1.4什么情况下出问题 7.1.5查询优化 使用explain 来分析sql使用的分区表 7.1.6合并 ...

  5. MySQL高级特性

    MySQL管理 用户管理 CREATE USER username IDENTIFIED BY 'password'; 新建用户 CREATE USER@'%' IDENTIFIED BY 'pass ...

  6. MySQL高级特性之分区表

    对于用户而言,分区表是一个独立的逻辑表,但是在底层由多个物理子表组成.实现分区的代码实际上是对一组底层表的句柄对象的封装,对分区表的请求都会通过句柄对象转化成对存储引擎的接口调用 意义 MySQL在创 ...

  7. 高性能mysql 第7章 mysql高级特性之分区表

    分区表: 分区表是一个独立的逻辑表,底层通过多个物理表实现. mysql实现分区表的方式是对底层表的封装.这意味着没有全局索引,索引是建立在底层的每个表上的(跟ORACLE不一样). 用到分区表的几种 ...

  8. Oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性及应用[-----]转载自https://www.cnblogs.com/rootq/(原地址) 关键词: 绑定变量(binding variable),共享池(sh ...

  9. springMVC第二天——高级参数绑定与其它特性

    大纲摘要: 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 2.@RequestMapping注解的使用 3.Controller方法返回值 4.Springmvc中异常处理 5 ...

随机推荐

  1. pyqt5之简单窗口的创建

    在学完tkinter后,发现tkinter在布局方面特别的不方便(Tkinter资料:http://effbot.org/tkinterbook/tkinter-index.htm),因此学习pyqt ...

  2. 配置NFS固定端口

    NFS启动时会随机启动多个端口并向RPC注册,为了设置安全组以及iptables规则,需要设置NFS固定端口.NFS服务需要开启 mountd,nfs,nlockmgr,portmapper,rquo ...

  3. MS-UAP发布的UWP的个人隐私策略

    我们十分重视您的隐私.本隐私声明解释了我们从您那里收集的个人数据内容以及我们将如何使用这些数据. 我们不收集任何与个人信息相关的数据,只收集与本UWP运行相关的数据,如: 产品使用数据:如每个页面的使 ...

  4. Visual Studio 2017 怎么将自动生成属性设置为旧版格式

    工具:Visual Studio 2017 1.点击工具,进入选项 2.选项窗口左侧找到C#--代码样式,点击 3.找到表达式首选项中:使用属性的表达式主体.使用索引器的表达式主体和使用访问器的表达式 ...

  5. 又拍云 API 使用的那些小事

    又拍云提供了丰富的 API 调用,为了减少用户在初次接入时可能会遇到的坑”,本文将对又拍云常用的 API 使用方法做个简单的梳理,力求让业务接入变得更简单,更高效. 目前我们的 API 主要有四大类, ...

  6. ActiveMq主从机制

    搭建mq主从时会在数据库创建3张关于mq的表: 下面介绍ACTIVEMQ_LOCK这张表的作用: Although the JDBC Store does not offer the best per ...

  7. asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

    一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json ...

  8. .NET Core protobuf-net、MessagePack、Json.NET序列化/反序列化性能测试

    测试代码Zonciu/SerializationTest.cs, 源自neuecc/ZeroFormatterBenchmark.cs. NuGet包及其版本 mgravell/protobuf-ne ...

  9. 知其所以然~mongodb副本集

    MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您 ...

  10. Linux~连接windows的ftp,unzip出现的问题

    在linux进行连接windows下的ftp服务器 ftp://192.168.2.71 输入用户名和密码登陆成功