MySQL-SQL绑定变量

认识绑定变量

绑定变量是为了减少解析的,比如你有个语句这样

select aaa,bbb from ccc where ddd=eee;

如果经常通过改变eee这个谓词赋值来查询,像如下

select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;

每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析。

Java实现绑定变量的方法:

[java] view plaincopy
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");  
pstmt.setBigDecimal(1, 15.00);  
pstmt.setInt(2, 110592);   
/result statmement:   UPDATE employees SET salay = 15.00 WHERE id = 110592  
pstmt.executeQuery(); 

假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:

[java] view plaincopy
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");  
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");  
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");  
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");  
....  
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");  

使用绑定变量,则:

[java] view plaincopy
PreparedStatement pstmt;  
for (id = 1; id < 10000; id  )  
{  
  if (null == pstmt)  
    pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");  
  pstmt.setBigDecimal(1, 150.00);  
  pstmt.setInt(2, id);   
  pstmt.executeQuery();  
}  

二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。

什么时候不应该/不必要使用绑定变量

  • 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。
  • 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值