Mysql prepare预处理的具体使用
来源:脚本之家
时间:2022-12-30 20:14:26 410浏览 收藏
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《Mysql prepare预处理的具体使用》,介绍一下mysqlprepare、预处理,希望对大家的知识积累有所帮助,助力实战开发!
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预处理内容请搜索golang学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持golang学习网!
好了,本文到此结束,带大家了解了《Mysql prepare预处理的具体使用》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!
-
318 收藏
-
335 收藏
-
467 收藏
-
303 收藏
-
176 收藏
-
368 收藏
-
475 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 听话的黄蜂
- 这篇技术文章真是及时雨啊,太详细了,很好,码住,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-05-21 01:07:21
-
- 开放的铃铛
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享博文!
- 2023-05-03 20:02:52
-
- 花痴的香烟
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享技术贴!
- 2023-03-06 19:47:44
-
- 细心的红酒
- 这篇技术文章出现的刚刚好,太详细了,很棒,mark,关注作者了!希望作者能多写数据库相关的文章。
- 2023-02-27 12:17:49
-
- 任性的芝麻
- 太细致了,已收藏,感谢楼主的这篇文章内容,我会继续支持!
- 2023-02-02 23:26:55
-
- 还单身的康乃馨
- 这篇文章出现的刚刚好,太细致了,很好,码起来,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-03 08:10:23