iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一文搞懂MySQL预编译
  • 602
分享到

一文搞懂MySQL预编译

MySQL预编译MySQL编译 2022-05-23 13:05:09 602人浏览 薄情痞子
摘要

1、预编译的好处   大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?   当客户发送一条sql语句给服务器后,服务器总是需要校验SQL语句的语

1、预编译的好处

  大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?

  当客户发送一条sql语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译成可执行的函数,最后才是执行SQL语句。其中校验语法,和编译所花的时间可能比执行SQL语句花的时间还要多。

  如果我们需要执行多次insert语句,但只是每次插入的值不同,Mysql服务器也是需要每次都去校验SQL语句的语法格式,以及编译,这就浪费了太多的时间。如果使用预编译功能,那么只对SQL语句进行一次语法校验和编译,所以效率要高。 

2、MySQL执行预编译

mysql执行预编译分为如三步:

  • 执行预编译语句,例如:prepare myfun from 'select * from t_book where bid=?'
  • 设置变量,例如:set @str='b1'
  • 执行语句,例如:execute myfun using @str

如果需要再次执行myfun,那么就不再需要第一步,即不需要再编译语句了:

  • 设置变量,例如:set @str='b2'
  • 执行语句,例如:execute myfun using @str

通过查看MySQL日志可以看到执行的过程:

3、使用Statement执行预编译

使用Statement执行预编译就是把上面的SQL语句执行一次。


Connection con = JdbcUtils.getConnection();
Statement stmt = con.createStatement();
stmt.executeUpdate("prepare myfun from 'select * from t_book where bid=?'");
stmt.executeUpdate("set @str='b1'");
ResultSet rs = stmt.executeQuery("execute myfun using @str");
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

stmt.executeUpdate("set @str='b2'");
rs = stmt.executeQuery("execute myfun using @str");

while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
stmt.close();
con.close();

4、useServerPrepStmts参数

  默认使用PreparedStatement是不能执行预编译的,这需要在url中给出useServerPrepStmts=true参数(MySQL Server 4.1之前的版本是不支持预编译的,而Connector/J在5.0.5以后的版本,默认是没有开启预编译功能的)。

  例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

  这样才能保证mysql驱动会先把SQL语句发送给服务器进行预编译,然后在执行executeQuery()时只是把参数发送给服务器。


Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

5、cachePrepStmts参数

  当使用不同的PreparedStatement对象来执行相同的SQL语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数key,导致二次编译。如果希望缓存编译后函数的key,那么就要设置cachePrepStmts参数为true。例如:

  jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true


Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

pstmt = con.prepareStatement(sql);
pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
  System.out.print(rs.getString(1) + ", ");
  System.out.print(rs.getString(2) + ", ");
  System.out.print(rs.getString(3) + ", ");
  System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

6、打开批处理

  MySQL的批处理也需要通过参数来打开:

rewriteBatchedStatements=true

以上就是一文搞懂MySQL预编译的详细内容,更多关于MySQL预编译的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 一文搞懂MySQL预编译

本文链接: https://www.lsjlt.com/news/9646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文搞懂vue编译器(DSL)原理
    目录什么是DSLvue中的DSL实现思路源码下载 什么是DSL DSL是领域特定语言的缩写,与JavaScript这种通用语言编译器相对,它只针对某一个特殊应用场景工作 类似中英翻译...
    99+
    2023-05-18
    vue编译器DSL vue DSL
  • 一文搞懂TypeScript的安装、使用、自动编译的教程
    1. 初识 TypeScript 上篇文章给大家介绍过TypeScript的安装、使用、自动编译的实现  需要的朋友点击查看。 TypeScript 的介绍  ...
    99+
    2024-04-02
  • 一文搞懂MySQL执行流程
    目录 一、MySQL技术架构 二、执行流程 1.连接器 2.查询缓存 3.解析SQL 4.执行SQL 总结 一、MySQL技术架构   可以看到,MySQL的技术架构共分为两层:Server层和存储引擎层 Server 层负责建立连接、分...
    99+
    2023-10-27
    mysql 面试 后端 数据库
  • 一文搞懂HBA卡
    HBA卡是一个简称,准确叫法应该是:主机总线适配器(Host Bus Adapter,HBA),也叫做FC-HBA卡(俗称:光纤网卡)、iSCSI-HBA卡(RJ45接口)。这是一个在服务器和存储装置间提供输入/输出(I/O)处理和物理连接...
    99+
    2023-08-31
    服务器
  • 一文说透什么是MySQL的预编译
    目录一、什么是mysql的预编译?二、 如何使用预编译?2.1 MySQL预编译的语法三、使用PreparedStatement进行预编译3.1 开启查询日志3.2 开启预编译功能3.3 cachePrepStmts参数...
    99+
    2024-04-02
  • 一文搞懂MySQL索引页结构
    目录1.前言2.索引页结构2.1FileHeader2.2PageHeader2.3UserRecords2.4Infimum&Supremum2.5PageDirector...
    99+
    2024-04-02
  • 一篇文章搞懂MySQL加锁机制
    目录前言锁的分类乐观锁和悲观锁共享锁(S锁)和排他锁(X锁)按加锁粒度区分全局锁表级锁(表锁和MDL锁)意向锁行锁间隙锁next-key lock(临键锁)加锁规则死锁和死锁检测总结...
    99+
    2024-04-02
  • 一文带你搞懂Spring响应式编程
    目录1. 前言1.1 常用函数式编程1.2 Stream操作2. Java响应式编程带有中间处理器的响应式流3. Reactor3.1 Flux & Mono3.2 Flux...
    99+
    2024-04-02
  • netstat命令,一文搞懂
    netstat命令是一个网络工具,用于显示计算机网络的连接状态和统计数据。它可以列出所有活动的网络连接,包括正在监听的端口、正在建立...
    99+
    2023-09-12
    netstat
  • 一文带你搞懂C语言预处理宏定义
    目录预定义符号#define#define 定义标识符#define 定义宏替换规则# 和##预定义符号 这些预定义符号都是语言内置的 __FILE__ //进行编译的源文...
    99+
    2022-11-13
    C语言预处理宏定义 C语言 宏定义 C语言 预处理
  • 一文搞懂JSON(JavaScript Object Notation)
    目录JSON出现Json结构Json对象Json对象与JavaScript对象JSON 和 JavaScript 对象互转Json数组复杂数组类型复杂对象数组组合对象包含数组数组包含...
    99+
    2024-04-02
  • 一文搞懂Spring中的JavaConfig
    目录配置类注册组件扫描包配置事务注解驱动单元测试加载配置类properties配置文件加载(了解)aspectj注解开关传统spring一般都是基于xml配置的,不过后来新增了许多J...
    99+
    2024-04-02
  • 一文搞懂MySQL索引特性(清晰明了)
    目录为什么要有索引?认识磁盘磁盘的结构磁盘的盘片结构定位扇区mysql与磁盘交互索引的理解测试主键索引索引的原理索引结构是否可以使用其他数据结构聚簇索引 vs 非聚簇索引总结为什么要有索引? MySQL索引的建立对于My...
    99+
    2023-04-10
    mysql索引特性 mysql索引特点 mysql索引使用
  • 一文搞懂Java桥接方法
    目录1.桥接方法简介2. 什么时候会生成桥接方法3. 为什么生成泛型方法4. 根据桥接方法获取实际泛型方法 1.桥接方法简介 桥接方法是jdk1.5引入泛型后,为使java...
    99+
    2024-04-02
  • 一文搞懂Java ScheduledExecutorService的使用
    目录一、创建ScheduledExecutorService对象二、ScheduledExecutorService方法三、固定速率和固定延时的区别1. 固定速率2. 固定延时四、调...
    99+
    2022-11-13
    Java ScheduledExecutorService使用 Java ScheduledExecutorService
  • 一文搞懂UART通信协议
    目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiv...
    99+
    2023-10-12
    UART协议 嵌入式 通信协议 单片机
  • 一文搞懂Codec2框架解析
    目录1 前言–Codec2.0是什么2 Codec2.0框架3 流程解析3.1 初始化流程3.2 启动流程3.3 Input Buffer的回调3.4 Output Buffer的回...
    99+
    2024-04-02
  • 一文带你搞懂Java8的LocalDateTime
    目录前言LocalDateTime获取当前时间获取当前时间的年月日时分秒给LocalDateTime赋值时间与字符串相互转换时间运算:加上对应时间时间运算:减去对应时间两个时间比较利...
    99+
    2023-05-14
    Java8 LocalDateTime使用 Java8 LocalDateTime
  • 一文搞懂SQL注入攻击
    目录1. 前言2. SQL注入简介(1)SQL语言(2)SQL注入3. SQL注入步骤(1)发现漏洞(2)信息收集(3)攻击Web系统(猜解用户名和密码)(4)获取管理员权限4. 防范SQL注入(1)使用参数化查询或存储...
    99+
    2023-04-19
    SQL注入攻击 SQL注入
  • 一文搞懂Codec2解码组件
    目录1 前言2 组件的创建3 组件接口4 组件运行原理5 小结1 前言 在本篇中,我们将关注Codec 2.0以下几个问题: 1.从顶而下,一个解码组件是如何创建的 2.组件的接口有...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作