请选择 进入手机版 | 继续访问电脑版

[MySql] Mysql prepare预处理的具体 利用

[复制链接]
查看73 | 回复13 | 2021-9-13 00:54:45 | 显示全部楼层 |阅读模式
目次

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操作:

  1. mysql>CREATE TABLE `t1` (
  2. `id` int NOT NULL,
  3. NAME varchar(20),
  4. KEY `idx_id` (`id`)
  5. ) ENGINE=InnoDB ;
  6. mysql>INSERT INTO t1(id,name) values(1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'),(6,'F');
  7. #设定预处理语句
  8. mysql>PREPARE stmt1 FROM 'SELECT * FROM t1 WHERE a=? ';
  9. #设置传递变量
  10. mysql>SET @a = 8;
  11. #执行语句
  12. mysql>EXECUTE stmt1 USING @a;
  13. #释放预处理语句
  14. mysql>DEALLOCATE PREPAR stmt1;
复制代码

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

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

image.jpg

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

C.存储过程包含预处理

预处理语句在存储的例程中创建预处理语句,则在存储的例程竣事 时不会开释 该语句。

  1. DELIMITER //
  2. DROP PROCEDURE IF EXISTS proc_prepared;
  3. CREATE PROCEDURE proc_prepared()
  4. BEGIN
  5. DECLARE a INT;
  6. DECLARE i INT;
  7. PREPARE stmt1 FROM 'SELECT * FROM t1 WHERE id>? ';
  8. SET @a = 5;
  9. EXECUTE stmt1 USING @a;
  10. END //
  11. DELIMITER ;
  12. call proc_prepared();
  13. 存储过程之后单独调用预处理语句,返回结果集:说明预处理没有销毁
  14. SET @a = 5;
  15. EXECUTE stmt1 USING @a;
  16. +----+------+
  17. | id | NAME |
  18. +----+------+
  19. | 6 | F |
  20. 。。。
复制代码

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

  1. 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 prepare预处理内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 漠河龙哥 | 2021-9-18 19:17:37 | 显示全部楼层
一口气看完了,我要下去回味回味了!
回复

使用道具 举报

avatar 刺客325 | 2021-9-19 06:48:21 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar 鹤翎商贸 | 2021-9-20 23:15:30 | 显示全部楼层
有钱、有房、有车,人人都想!
回复

使用道具 举报

avatar 淡情惜缘缘wt | 2021-9-26 23:28:36 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

avatar 匣中剑他娘官 | 2021-9-27 17:00:23 | 显示全部楼层
好无聊啊!
回复

使用道具 举报

avatar 穆一平 | 2021-10-1 22:00:37 | 显示全部楼层
支持一下!
回复

使用道具 举报

avatar ai2017 | 2021-10-2 00:33:56 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

avatar 风雨狼 | 2021-10-11 17:50:41 | 显示全部楼层
顶一下,收藏了!
回复

使用道具 举报

avatar 深海渔灯每 | 2021-10-13 10:09:24 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则