Mysql prepare预处理的具体使用

目录
  • 1.预处理
  • 2.预处理应用方式
    • A.例子:
    • B.预处理对执行计划变化跟踪
    • C.存储过程包含预处理
    • D.通过profile 查看解析语句的开销
  • 3.总结

MySQL PREPARE预处理技术意义在于,是为了减轻服务器压力的一种技术。

就是说绝大多数情况下,某需求某一条SQL语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同。
比如:

  • SELECT的 WHERE子句值不同;
  • UPDATE的 SET子句值不同;
  • INSERT的 VALUES值不同;
    如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显下降。

1.预处理

MySQL提供了对服务器端准备语句的支持,就叫预处理。

这种支持利用了高效的客户机/服务器二进制协议,使用带有参数值占位符的预编译语句有以下好处:

  • 减少每次执行语句时解析语句的开销。通常,数据库应用程序处理大量几乎相同的语句,只对子句中的字面值或变量值进行更改,例如用于查询和删除的WHERE、用于更新的SET和用于插入的values。
  • 防止SQL注入攻击。参数值可以包含未转义的SQL引号和分隔符。

预处理接口

1.应用程序中的预处理语句
可以通过客户端编程接口使用服务器端准备好的语句,包括用于C程序的MySQL C API客户端库,用于Java程序的MySQL Connector/J,以及用于使用。NET技术的程序的MySQL Connector/NET。例如,C API提供了一组函数调用,这些函数调用构成了它的预编译语句API

2.SQL脚本中的准备语句
还有一个用于预处理语句的替代SQL接口。但不需要编程,在SQL级别直接可用,可以在任何可以将SQL语句发送到要执行的服务器的程序中使用它,例如mysql客户端程序。

2.预处理应用方式

预处理语句的SQL语法基于三个SQL语句:

  • PREPARE语句准备执行。
  • EXECUTE执行一条预处理语句。
  • DEALLOCATE PREPARE释放一个预处理语句。

A.例子:

预处理语句无法跨SESSION操作:

mysql>CREATE TABLE `t1` (
  `id` int NOT NULL,
   NAME varchar(20),
KEY `idx_id` (`id`)
) ENGINE=InnoDB ;

mysql>INSERT INTO t1(id,name) values(1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'),(6,'F');

#设定预处理语句
mysql>PREPARE stmt1 FROM  'SELECT * FROM t1 WHERE a=? ';

#设置传递变量
mysql>SET @a = 8;

#执行语句
mysql>EXECUTE stmt1 USING @a;

#释放预处理语句
mysql>DEALLOCATE PREPAR stmt1;

B.预处理对执行计划变化跟踪

通过观察status指标Select_scan(执行全表搜索查询的数量)变化判断是否会受到数据量变更的影响。

预处理sql语句随着数据量的变化执行计划也在变更。

C.存储过程包含预处理

预处理语句在存储的例程中创建预处理语句,则在存储的例程结束时不会释放该语句。

DELIMITER //

DROP PROCEDURE IF EXISTS proc_prepared;
CREATE PROCEDURE proc_prepared()
BEGIN
DECLARE a INT;
DECLARE i INT;
PREPARE stmt1 FROM  'SELECT * FROM t1 WHERE id>? ';
SET @a = 5;
EXECUTE stmt1 USING @a;
END //

DELIMITER ;

call proc_prepared();
存储过程之后单独调用预处理语句,返回结果集:说明预处理没有销毁

SET @a = 5;
EXECUTE stmt1 USING @a;
+----+------+
| id | NAME |
+----+------+
|  6 | F    |
。。。

存储过程之后单独调用预处理语句,返回结果集:说明预处理没有销毁

SET @a = 5; EXECUTE stmt1 USING @a; +----+------+ | id | NAME | +----+------+ | 6 | F | 。。。

D.通过profile 查看解析语句的开销

通过profile各种语句执行时间,解析语句花费的时间都在0.01秒以内。可以忽略不计。
所以目前在预处理方面上没有发现明显的优势。

3.总结

预编译初始的作用:

  • 提高效率:事先解析、检查、编译等工作。
  • 提高安全性:预防SQL注入

局限性和实际效果:

  • 预处理因为局限在session级别,现在无法体现真正的价值。因为mysql GA版本没有线程池概念,每个链接就是每个session
  • 解析编译语句的开销 基本对于mysql环境来说忽略不计
  • 执行计划也是随着数据量而变化的。

从局限性和实际效果来看,目前没有发挥应有的功能。不适合声场环境中使用。

到此这篇关于Mysql prepare预处理的具体使用的文章就介绍到这了,更多相关Mysql prepare预处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中预处理语句prepare、execute与deallocate的使用教程

    前言 MySQL官方将prepare.execute.deallocate统称为PREPARE STATEMENT,我习惯称其为[预处理语句],其用法十分简单,下面话不多说,来一起看看详细的介绍吧. 示例代码 PREPARE stmt_name FROM preparable_stmt EXECUTE stmt_name [USING @var_name [, @var_name] ...] - {DEALLOCATE | DROP} PREPARE stmt_name 举个栗子: mysql>

  • 理解Mysql prepare预处理语句

    MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势.候选界面包括MySQL C API客户端库(用于C程序).MySQL Connector/J(用于Java程序)和MySQL Connector/NET.例如,C API可以提供一套能组成预制语句API的函数调用.其它语言界面可以对使用了二进制协议(通过在C客户端库中链接)的预制语句提供支持.对预制语句,还有一个SQL界面可以利用.与

  • Mysql prepare预处理的具体使用

    目录 1.预处理 2.预处理应用方式 A.例子: B.预处理对执行计划变化跟踪 C.存储过程包含预处理 D.通过profile 查看解析语句的开销 3.总结 MySQL PREPARE预处理技术意义在于,是为了减轻服务器压力的一种技术. 就是说绝大多数情况下,某需求某一条SQL语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同. 比如: SELECT的 WHERE子句值不同: UPDATE的 SET子句值不同: INSERT的 VALUES值不同: 如果每次都需要经过上面的词法语义解析

  • MySQL prepare语句的SQL语法

    MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ; PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句.

  • MySQL SQL预处理(Prepared)的语法实例与注意事项

    目录 一.SQL 语句的执行处理 1.即时 SQL 2.预处理 SQL 二.Prepared SQL Statement Syntax 三.预处理 SQL 使用注意点 四.Prepared Statements优点 总结 一.SQL 语句的执行处理 1.即时 SQL 一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下: 1. 词法和语义解析: 2. 优化 SQL 语句,制定执行计划: 3. 执行并返回结果: 如上,一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作

  • MySQL prepare原理详解

    Prepare的好处  Prepare SQL产生的原因.首先从mysql服务器执行sql的过程开始讲起,SQL执行过程包括以下阶段 词法分析->语法分析->语义分析->执行计划优化->执行.词法分析->语法分析这两个阶段我们称之为硬解析.词法分析识别sql中每个词,语法分析解析SQL语句是否符合sql语法,并得到一棵语法树(Lex).对于只是参数不同,其他均相同的sql,它们执行时间不同但硬解析的时间是相同的.而同一SQL随着查询数据的变化,多次查询执行时间可能不同,但硬解

  • php+mysql prepare 与普通查询的性能对比实例讲解

    php+mysql prepare 与普通查询的性能对比 实例代码如下: <?php class timer { public $StartTime = 0; public $StopTime = 0; public $TimeSpent = 0; function start(){ $this->StartTime = microtime(); } function stop(){ $this->StopTime = microtime(); } function spent() {

  • MySQL使用游标批量处理进行表操作

    一.概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章. 理解MySQL变量和条件:http://www.jb51.net/article/81375.htm 理解Mysql prepare预处理语句:http://www.jb51.net/article/81378.htm 理解MySQL存储过程和函数:http://www.jb51.net

  • MySQL的prepare使用及遇到bug解析过程

    目录 一.问题发现 二.问题调查过程 三.问题解决方案 四.问题总结 一.问题发现 在一次开发中使用 MySQL PREPARE 以后,从 prepare 直接取 name 赋值给 lex->prepared_stmt_name 然后给 EXECUTE 用,发现有一定概率找不到 prepare stmt 的 name,于是开始动手调查问题发生的原因. SQL语句示例: CREATE TABLE t1 (a INT, b VARCHAR(10)); PREPARE dbms_sql_stmt4 F

  • 对比PHP对MySQL的缓冲查询和无缓冲查询

    关于缓冲查询和无缓冲查询 MySQL的客户端有两种类型的查询: 缓冲查询:将接收查询的结果并把他们存储在客户端的缓存中,而且接下来获取行记录的请求仅仅从本地内获取. (1)优点:可以在结果集中自由地移动"当前行"的指针,这样很容易找到,因为结果是存在客户端的. (2)缺点:需要额外的内存来存储这些结果集,而且需要大量的内存,另外,php中用来运行查询的函数会一直到所有的结果都接收才会返回值. 无缓冲查询:会限制你通过严格的顺序访问查询结果.但他不需要额外的内存来存储整个结果集.你可以在

随机推荐