Mysql prepare预处理的具体使用

 更新时间:2021年09月08日 15:57:45   作者:Kevin崔  
本文主要介绍了Mysql prepare预处理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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(执行全表搜索查询的数量)变化判断是否会受到数据量变更的影响。

image.jpg

预处理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秒以内。可以忽略不计。
所以目前在预处理方面上没有发现明显的优势。

image.jpg

3.总结

预编译初始的作用:

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

局限性和实际效果:

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

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

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

相关文章

  • MySql执行流程与生命周期详解

    MySql执行流程与生命周期详解

    当你执行一次MySQL查询时,有没有仔细想过,在查询结果返回之前,经过了哪些步骤呢?这些步骤有可能消耗了超出想象的时间和资源。因此,在对MySQL的查询进行优化之前,应该了解一下MySQL查询的生命周期
    2022-09-09
  • mysql 导入导出数据库、数据表的方法

    mysql 导入导出数据库、数据表的方法

    这篇文章主要介绍了mysql 导入导出数据库、数据表的方法,有需要的朋友可以参考一下
    2013-11-11
  • mysql从一张表查询批量数据并插入到另一表中的完整实例

    mysql从一张表查询批量数据并插入到另一表中的完整实例

    这篇文章主要给大家介绍了关于mysql从一张表查询批量数据并插入到另一表中的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MySQL count(1)、count(*)、count(字段)的区别

    MySQL count(1)、count(*)、count(字段)的区别

    COUNT在数据库行数统计中被广泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的区别吗,本文就想的介绍一下,感兴趣的可以了解一下
    2021-12-12
  • mysql 触发器用法实例详解

    mysql 触发器用法实例详解

    这篇文章主要介绍了mysql 触发器用法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • MySQL切分函数substring()的具体使用

    MySQL切分函数substring()的具体使用

    这篇文章主要介绍了MySQL切分函数substring()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mysql登录警告问题的解决方法

    mysql登录警告问题的解决方法

    这篇文章主要为大家详细介绍了mysql登录警告问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MySQL数据库的主从同步配置与读写分离

    MySQL数据库的主从同步配置与读写分离

    这篇文章主要介绍了MySQL数据库的主从同步配置与读写分离,需要的朋友可以参考下
    2018-01-01
  • 跳槽必备之你设计索引的原则是什么?怎么避免索引失效?

    跳槽必备之你设计索引的原则是什么?怎么避免索引失效?

    索引的设计可以遵循一些已有的原则,创建索引的时候请尽量符合这些原则,便于提升索引地使用效率,更高效地使用索引。今天给大家介绍跳槽必备之你设计索引的原则是什么?怎么避免索引失效?感兴趣的朋友一起看看吧
    2021-05-05
  • Mysql表的七种类型详细介绍

    Mysql表的七种类型详细介绍

    Mysql表类型都有哪些是一定需要知道的,下面就为您介绍七种Mysql表类型,希望能对您学习Mysql表类型有所帮助,需要的朋友可以了解下
    2012-11-11

最新评论