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 设置变量以及执行变量的语句
除了访问的session 断掉后,可以立即释放prepare的资源,手动的通过 deallocate 命令也可以释放prepare的资源。
DEALLOCATE PREPARE st;
在网上也有类似关于prepare 方面的的问题, 如下,下面的问题是咨询在mysql中 使用prepare 功能是否可以将变量设置为表名。
实际上这个问题是有问题,忽略了prepare本身的设置这个功能的用意,preare功能本身主要的要点是节省 execute plan 的时间,通过一次prepare来让后面执行的语句全部用同一种执行计划, 而如果将变量设置为表名的话,那么这个功能的意义在哪里,每次还是必须要进行执行计划的初始,这就丧失了prepare的整体意义,属于没有理解这个功能的意义。
mysql 在8.0 提出的新的prepare功能本身是基于其他数据库已有的功能进行的功能补充和添加,为拉平MYSQL与其他主流数据库在这方面的功能短板,不过也说明MYSQL 正在变得越来越好。