在数据库应用中,很多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