首页 > 数据库 >MySQL执行过程(一条SQL从Java到数据库都经历了什么)

MySQL执行过程(一条SQL从Java到数据库都经历了什么)

时间:2022-10-24 21:12:25浏览次数:74  
标签:Java 数据库 sql SQL MySQL 执行

MySQL执行过程(一条SQL从Java到数据库都经历了什么)  2021-11-14 20:44:47     小道仙     100阅读     0评论

视频地址 https://www.bilibili.com/video/bv1Sq4y1377k


从我们学习Java开始,我们就学了很多种操作数据库的方式,最开始的JDBC、后面的JPA、HIbernate、MyBatis,那你是否想过,我们只是简单的写了一个sql,最终是如何到达数据库、返回结果?这中间都经历了什么呢?


不管我们是用原生的JDBC还是后面的ORM框架,我们都会引入这样一个pom文件,这就是MySQL驱动,我们通过这个驱动去连接MySQL

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>

那么看起来就像这样

image.png

我们知道,每一个系统都是有并发量的,为了保证系统高效的运行,就注定了不可能是单线程的运行,同样操作数据的时候也是一样,我们学过了很多数据库连接池,C3P0、DBCP、Druid等,这些是在Java这边的连接池,同理数据库层面肯定也不能只是一个线程来执行我们的任务,所以数据库这边也会有对应的连接池。

image.png

当然上面是省略了一部分,那就是数据库对你这个连接进行身份校验的操作。


现在想一想,当一个请求到了数据库,数据库收到之后是不是就得分配一个线程,然后去执行这个sql呢?

其实这当然不是了,毕竟数据库是一个系统,它不是人,当我们要去电脑里面找寻某个文件的时候,我们脑海里是知道这个文件在什么的位置的,它叫什么。

同样的系统要把我们的这个请求进行解析,解析成它可以理解的语法,然后再去做相关操作,具体的逻辑顺序如下:

SQL接口

这个sql接口,就是用来接受应用服务器发送的sql

当应用服务器通过连接通道发送sql到数据库后,数据库从连接池里面拿到后,分发一个线程去进行处理,第一步就是把sql交给这个sql接口。

SQL解析器

某种程度上讲,系统和我们人类是类似的,我们的眼睛如同SQL接口获取信息,SQL解析器则如同我们的大脑,对获取的内容进行解析、拆分,然后变成数据库所能理解的内容。

查询优化器

一个简单的sql SELECT name FROM user WHERE id = 1 它可能有多种执行策略:

  • 先查询出全部的 name,然后再取出 id=1 的数据
  • 直接先找寻id=1 的数据,然后再取出它的 name

毫无疑问肯定是第二种策略更好,第一种就是全表扫描了,当然真正的执行策略并不一定就是我这里所说的这样,这只是一个比喻。

一个稍微复杂一点的SQL,它很有可能会有很多种的执行策略,那么这个查询优化器,就会帮助我们来选择一个最合适的策略。

执行器

当优化器选择最合适的执行策略之后,就由执行器去调用对应的引擎去操作硬盘上的数据了。(虽然引擎有很多比如innodb、myisam等,但用的最多的还是innodb了)

image.png

buffer pool

在InnoDB引擎下,所有的操作都是先把数据读取到缓冲池(这个就是内存的一块区域),然后在这个区域内进行增删改查操作,之所以这样做是因为在内存操作的性能要远远高于在硬盘中的操作。


理解了上面都执行流程之后,我们只需要记住这个执行链,然后再基于自己的理解就好了

  • SQL接口 > SQL解析器 > 查询优化器 > 执行器 > 调用引擎接口去执行
  转载:https://www.xdx97.com/article/909544418741059584

标签:Java,数据库,sql,SQL,MySQL,执行
From: https://www.cnblogs.com/wugh8726254/p/16823000.html

相关文章

  • 大数据计算,如何优化SQL?
    前言很多大数据计算都是用SQL实现的,跑得慢时就要去优化SQL,但常常碰到让人干瞪眼的情况。很多大数据计算都是用SQL实现的,跑得慢时就要去优化SQL,但常常碰到让人干瞪眼的情......
  • docker安装mysql
    Docker安装MySql并启动 2020-05-1119:48:33    小道仙    1311阅读    1评论一、安装Dockerhttps://www.xdx97.com/article/708979301071978496......
  • docker 配置mysql主从复制
    二、主从复制2-1:配置主服务器2-1-1:配置主服务器的my.cnf添加以下内容[mysqld]##同一局域网内注意要唯一server-id=1##开启二进制日志功能,可以随便取(关键)log-bin......
  • PVE创建ubuntu CT并安装sqlServer
    一、创建LXC容器模板选择下载好的ubuntu20.04网络选择一个未分配的静态IP    二、登录到ubuntu系统,开启ssh登录......
  • MySQL 读书笔记(一)
    1MySQL表1.1索引组织表在InnoDB存储引擎中,表都是根据主键顺序存放的,这种存储方式称为索引组织表。InnoDB存储引擎中,每张MySQL表都有一个唯一主键,如果创建表时......
  • java关键字 不可用于包命名
    现象:新建的enum包与新建test包图标不一样查看EnumModel.java类发下包路径报错尝试对test包进行重命名当然如果遇到非java关键字的情况,可以尝试用以下方法进......
  • 统信安装mysql
    ​​https://dev.mysql.com/downloads/repo/apt/​​......
  • mysql创建账号和分配取消权限
    虽然网上资料很多,但自己每次都要查有的麻烦,这里自己记录下。1、没账号时创建账号:createuser'用户名'@'%'identifiedby'密码';%表示不限制,也可以写要限制的具体ip......
  • apt-get 安装 mysql
    apt-get安装mysqlroot@node140:~#apt-getinstallmysql-server正在读取软件包列表...完成正在分析软件包的依赖关系树正在读取状态信息...完成下列软件......
  • 如何使用binlog2sql快速恢复Mysql误删除的数据
    文章目录​​前言​​​​......