MYsql准备语句
MySQL支持准备语句,即在执行真正的查询前,将查询的模式先发送到服务器进行解析,将解析和优化的结果保存下来,在一些编程库中支持这种功能,通过准备语句可以很高效的在客户端和服务器端进行数据发送。
准备语句中,将?作为参数,例如:
INSERT INTO people(last_name,first_name) values(?,?);
Mysql将把一个状态句柄发送给客户端,客户端根据状态句柄把每个问号对应的值发送到服务器执行查询,具体方式取决与编程语言
准备语句具有以下优点:
1.只需解析一次查询
2.缓存了部分执行计划
3.使用二进制发送参数,速度更快
4.只发送参数,减少网络流量
5.参数被保存在服务器缓冲区,无需在内存中到处拷贝数据
除了函数库,MySQL也有准备语句的sql接口,例如:
mysql> set @sql = 'select * from people where last_name = ?';
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE pre_test FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> SET @name ='zz11';
Query OK, 0 rows affected (0.00 sec)
mysql> EXECUTE pre_test USING @name;
+-----------+------------+------------+--------+
| last_name | first_name | dod | gender |
+-----------+------------+------------+--------+
| zz11 | ss | 0000-00-00 | m |
+-----------+------------+------------+--------+
1 row in set (0.01 sec)
通过这种方法,可以在存储过程内实现一种类似“动态SQL”的效果。但注意这里SQL接口使用的并不是二进制协议。
准备语句具有一些局限:
1.只针对一个连接;
2.不能使用5.0之前的缓存
3.不能在存储函数内使用
4.如果忘记销毁,可能在服务器端产生资源泄漏,并且有一个全局参数限定存储语句数量。