MYSQL 8.0 终于拥有了prepare 功能

MYSQL 8.022 有了prepare 功能,prepare 功能是ORACLE 和 PG 都拥有和在很多应用场景都使用的功能。主要的作用为

1  在SQL 语句中可以通过变量将值传递给语句

2  执行计划在变量为赋值前就已经做好

3  执行计划在prepare 后执行计划就固定了

总结prepare的主要作用:

减少每次执行语句时解析语句的开销。在数据库应用程序处理大量相同的语句,仅仅对子句条件变量值进行更改,同时可以防止SQL 注入满足部分安全功能。这个功能本身在PG 以及ORACLE 等数据库都有满足。MYSQL 属于弥补之前功能的不足。

MYSQL 提供了客户端编程接口可以使用包括 C ,Java, NET 等程序的接口在程序中调用相关的函数来使用预编译API语句的功能。

在MYSQL 内部进行的语法如下

prepare sql from preparable_stmt

通过这个语法来声明,这里声明的prepare 语句必须是单语句,不能是复合语句,在声明时也只能对变量进行声明,不能对语句中的字段以及表进行变量的绑定。在声明时如果重复声明则会导致前面的声明被deallocated,注销掉。在声明prepare后,在使用中如果连接断掉,则prepare的声明立即失效,声明语句的变量的类型也会在第一次申请时进行固化,不能在使用中变化。

下面是简单使用prepare   设置变量以及执行变量的语句

17e5fda8991f1d2132ca4fcc154e9370.png

c4adacf33893fcc12000c91f0f48503c.png

除了访问的session 断掉后,可以立即释放prepare的资源,手动的通过 deallocate 命令也可以释放prepare的资源。

DEALLOCATE PREPARE st;

7a2f7321d7fb22819011ccafcc7f343b.png

在网上也有类似关于prepare 方面的的问题, 如下,下面的问题是咨询在mysql中 使用prepare 功能是否可以将变量设置为表名。

实际上这个问题是有问题,忽略了prepare本身的设置这个功能的用意,preare功能本身主要的要点是节省 execute plan  的时间,通过一次prepare来让后面执行的语句全部用同一种执行计划, 而如果将变量设置为表名的话,那么这个功能的意义在哪里,每次还是必须要进行执行计划的初始,这就丧失了prepare的整体意义,属于没有理解这个功能的意义。

8032ba21dfacfa886ea64494ccdbd02d.png

mysql 在8.0 提出的新的prepare功能本身是基于其他数据库已有的功能进行的功能补充和添加,为拉平MYSQL与其他主流数据库在这方面的功能短板,不过也说明MYSQL 正在变得越来越好。

344f42fdb132d32bf791ca2bc0bbd859.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值