mysql的prepared statement

写过java,rails,php等的同学都知道,mysql在执行中有一个占位符的sql,比如rails里:

ModelTest.where("id = ?", 100)

但是在这个语句的背后,语言又做了什么事情呢?

调研看,它在生成sql之前会将占位符替换掉,生成真正的sql。

但是mysql里却是真正支持占位符的,它叫prepared statement。

用法如下:

mysql> PREPARE stmt_test FROM 'select name_chn from tags where id=?';
Query OK, 0 rows affected (0.01 sec)
Statement prepared

mysql> PREPARE stmt_test FROM 'select name_chn from tags where id = ?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> SET @tag_id=1;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt_test USING @tag_id;
+-----------+
| name_chn  |
+-----------+
| 9.9包邮   |
+-----------+
1 row in set (0.00 sec)

mysql> 

分为三个步骤:

第一步准备并编译一个statement(stmt_test);
第二步设置占位符对应变量的值(tag_id);
第三步执行statement。

这样的使用场景是什么呢,应该是一个这么场景,一个语句是一定的模板,但是里面一个或者两个值有变化,并且执行次数很多,使用以上方法会少一步编译sql的过程,会很大的提高效率的。

那statement是不是可以无限量的生成呢,答案肯定不是。

在mysql的配置项里有这么一个配置:max_prepared_stmt_count,代表最大的stmt量,查询mysql的官方文档:


可以看出stmt是有限制的,那么,我们怎么使用它才能不超过限制呢?

我也不知道,官方文档有一段是这样说的:

This variable limits the total number of prepared statements in the server. It can be used in environments where there is the potential for denial-of-service attacks based on running the server out of memory by preparing huge numbers of statements. If the value is set lower than the current number of prepared statements, existing statements are not affected and can be used, but no new statements can be prepared until the current number drops below the limit. The default value is 16,382. The permissible range of values is from 0 to 1 million. Setting the value to 0 disables prepared statements.

我猜想应该是需要我们自己维护一个全局变量代表已经生成的stmt数量吧。

那么如果我们知道了stmts的量已经超了,怎么删除呢?

mysql> DEALLOCATE PREPARE stmt_test;
Query OK, 0 rows affected (0.00 sec)

简单介绍到这吧,至于在各个语言里怎么用,就要看各自的api了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值