MySQL Prepared语句的具体使用
在数据库应用中,很多SQL语句都会重复执行很多次,每次执行可能只是where条件中的变量值不同,但mysql依然会解析SQL语法并生成执行计划。对于这类情况,可以利用prepared语句来避免重复解析SQL的开销。
一、prepared语句优点
prepared语句通过准备一个SQL执行对象,然后通过execute语句来重复进行执行,在每次执行的过程中提供变量的实际值。相比于重复执行SQL语句,prepared statement具有如下优势:
- 在execute语句重复执行的过程中,每次只有传入的变量值不同,SQL的执行计划不会改变,避免重复解析SQL。
- 避免SQL注入攻击。
二、prepare语句用法
prepare statement主要有3个组成部分:
- prepare语句:生成一个prepared statement对象并为其指定别名,可使用占位符?指定变量。
- execute语句:通过别名执行一个prepared statement,可通过using子句为变量提供值。
- deallocate prepared语句:通过别名释放一个prepared statement。
Prepare语句的生效范围是会话,MySQL使用参数max_prepared_stmt_count来控制语句的最大数量,如果将该参数设置为0,将会禁用prepared statement功能。
show variables like 'max_prepared_stmt_count';
执行如下SQL准备示例数据:
create table person(
id int auto_increment primary key,
name varchar(32));
insert into person values (null, 'Vincent'), (null, 'Victor'), (null, 'Grace');
select * from person;
2.1 prepare语句
prepare语句根据文本生成一个SQL语句对象,并为其指定一个别名,在准备过程中,可以使用占位符?来替代变量:
set @sql = 'select name from person where id=?';
prepare stmt from @sql;
示例中通过变量名来传入SQL文本,也可以直接通过SQL文本prepare,例如:prepare stmt from ‘select name from person where id=?’;
prepare语句还有一个较常用的场景为动态SQL拼接。即根据用户选择的条件来快速调整过滤条件拼接出不同的SQL:
set @base = 'select * from person where 1=1';
set @id_filter = ' and id=?';
set @name_filter = ' and name=?';
set @sql2 = concat(@base, @id_filter, @name_filter); -- 选择了条件,就加入拼接
prepare stmt2 from @sql2;
2.2 execute语句
执行完prepare语句后,即可用execute语句来执行,如果有?代替的变量,则需要通过using语句为其指定值(数量要和prepare语句中?数量相同)。execute语句在每次执行提供不同的变量,即可实现一次解析,多次执行:
set @var1 = 1;
execute stmt using @var1;
set @var2 = 2;
execute stmt using @var2;
注意using子句中只能通过变量来提供值,如果通过常量提供值,则会报错:
execute stmt using 1;
2.3 deallocate prepare语句
prepare语句使用完成后可以使用deallocate/drop prepare ….语句手动进行释放,另外当会话断开时,所有未释放的prepare语句也会自动释放,因此重连或者异常中断都会导致prepare statement丢失。
deallocate prepare stmt;
到此这篇关于MySQL Prepared语句的具体使用的文章就介绍到这了,更多相关MySQL Prepared语句内容请搜索编程客栈(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341