mysql——预处理Prepared

mysql——预处理Prepared,第1张

某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。

所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。

预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

注意:虽然可能是通过预处理 SQL 的方式一定程度的提高了效率,但是对于优化而言,最优的执行计划不是光靠 SQL 语句的模板化来实现的,往往还是需要通过具体值来预估出成本代价。

MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT。

步骤大概分为四步:

1 set —— SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'

2 prepare —— PREPARE stmt2 FROM @s

3 execute —— EXECUTE stmt2

4 deallocate —— DEALLOCATE PREPARE stmt2

简单点理解:prepareStatement会形成参数化的查询,例如:

1

select * from A where tablename.id = ?

传入参数'1select * from B'如果不经过prepareStatement,会形成下面语句:

1

select * from A where tablename.id = 1select * from B

这样等于两次执行,但如果经过预处理,会是这样:

1

select * from A where tablename.id = '1select * from B'

'1select * from B'只是一个参数,不会改变原来的语法


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7435751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存