MySQL原理简介—1.SQL的执行流程

大纲(2426字)

1.MySQL驱动的作用

2.Java系统中的数据库连接池的作用

3.MySQL中的数据库连接池的作用

4.网络连接必须让线程来处理

5.SQL接口会负责处理接收到的SQL语句

6.查询解析器会让MySQL读懂SQL语句

7.查询优化器会选择最优的查询路径

8.调用存储引擎接口来真正执行SQL语句

9.执行器会根据执行计划调用存储引擎的接口

1.MySQL驱动的作用

如果要在Java系统中访问MySQL,必须在系统依赖中加入MySQL驱动。有了MySQL驱动才能和MySQL建立连接,然后才能执行各种SQL语句。下面maven配置中就引入了一个MySQL驱动:

<dependency>
    <groupId>MySQL</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

如果Java系统要访问数据库,首先得与数据库建立一个网络连接。那么这个连接由谁来建立呢?其实就是由MySQL驱动来建立的,它会在底层与数据库建立网络连接。有了网络连接才能去发送请求给数据库服务器,如下图示:

当Java系统和数据库有了网络连接后,Java代码才能基于这个网络连接去执行各种各样的增删改查SQL语句。如下图示:

所以MySQL会提供各种语言的MySQL驱动,让各种语言编写的系统通过MySQL驱动去访问数据库。

2.Java系统中的数据库连接池的作用

一个Java系统肯定不会只和数据库建立一个连接。因为Java系统本身会有多个线程来并发地处理多个请求。如下图示:

这时如果Java系统中的多个线程并发处理多个请求时,都要抢夺一个连接去访问数据库,那么其效率肯定是很低的。

如果Java系统中的每个线程在每次访问数据库时,都基于MySQL驱动去创建一个自己用的数据库连接,然后执行SQL并且在执行完SQL后再销毁这个数据库连接,这样也是不可行的。

因为可能出现Java系统中上百个线程并发频繁创建和销毁数据库连接。而每次建立一个数据库连接都很耗时,从而导致请求处理的效率很低。

所以一般会使用一个数据库连接池,在一个池子里维持多个数据库连接,让多个线程使用里面的不同的数据库连接去执行SQL语句。执行完SQL语句后,不要销毁这个数据库连接,而是把连接放回池子里,以便后续还可以继续使用。

基于这样的一个数据库连接池机制,就可解决多个线程并发创建和销毁多个数据库连接去执行SQL语句的问题。

常见的数据库连接池:DBCP、C3P0、Druid等。

3.MySQL中的数据库连接池作用

任何一个Java系统都应该有一个数据库连接池去访问数据库。也就是这个系统会有多个数据库连接,供多线程并发的使用;这样MySQL就需要维护与Java系统之间的连接,所以MySQL架构体系中的第一个环节,就是连接池。MySQL中的连接池就是维护与Java系统之间的多个数据库连接。

除此之外,Java系统每次跟MySQL建立连接,MySQL都会根据Java系统传递过来的账号密码进行库表权限的验证。

4.网络连接必须让线程来处理

假设MySQL服务器的连接池的某个连接收到了某条SQL语句的网络请求。那么谁负责从这个连接中去监听网络请求?谁把网络连接里的请求数据读取出来?

网络连接必须得分配给一个线程去处理,由一个线程来监听请求以及读取请求数据。比如从网络连接中读取和解析出一条SQL语句请求。

5.SQL接口会负责处理接收到的SQL语句

当MySQL的工作线程从一个网络连接中读取出一条SQL语句后,此时会如何执行这个SQL语句呢?MySQL内部会提供一个组件,就是SQL接口。

SQL接口是一套执行SQL语句的接口,它专门用于执行Java系统发送给MySQL的增删改查SQL语句。所以MySQL的工作线程读取出SQL语句后,就会转交给SQL接口执行。

6.查询解析器会让MySQL能读懂SQL语句

假设有这么一条SQL语句:

select id,name,age from users where id = 1;

那么查询解析器(Parser)会负责解析SQL语句,比如查询解析器(Parser)会对上面这条语句进行拆解成以下几个部分:

一.需要从"users"表里查询数据

二.查询"id"字段的值等于1的那一行数据

三.对查出来的那一行数据要提取里面的"id,name,age"三个字段

所谓SQL解析:就是按既定的SQL语法,对传递进来的SQL语句进行解析,然后理解该SQL语句的意图。

7.查询优化器会选择最优的查询路径

当MySQL通过查询解析器理解SQL语句要干什么后,接着就会找查询优化器(Optimizer)来选择一个最优的查询路径。

查询优化器(Optimizer)会针对SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。

8.调用存储引擎接口来真正执行SQL语句

获取到查询优化器选择的最优查询路径后,即应该按照一个什么样的顺序和步骤去执行这个SQL语句的计划,MySQL就会把这个计划交给底层的存储引擎去执行。

这个存储引擎是MySQL架构设计中很有特色的一个环节。对于数据库而言,数据要不就是放在内存里、要不就是放在磁盘文件里。

现在已知SQL语句会按照最优的查询路径进行执行,但MySQL怎么知道哪些数据在内存里、哪些数据在磁盘里?执行时是更新内存的数据还是更新磁盘的数据?如果更新磁盘的数据,要先查询哪一个磁盘文件,再更新哪一个磁盘文件?这些问题就需要存储引擎来解决了。

存储引擎在执行SQL语句时,会按一定的步骤进行一系列操作。比如查询内存缓存数据、查询磁盘数据、更新磁盘数据等。

9.执行器会根据执行计划调用存储引擎的接口

存储引擎可帮助MySQL去访问内存及磁盘上的数据,那么谁来调用存储引擎的接口呢?那就是执行器。

执行器会根据查询优化器选择的执行方案,去调用存储引擎的接口。执行器会按照一定的顺序和步骤,去执行SQL语句的逻辑。

比如执行器首先会调用存储引擎的接口去获取"users"表中的第一行数据。然后判断一下这个数据的"id'字段的值是否等于SQL语句期望的一个值。如果不等那就继续调用存储引擎的接口去获取"users"表的下一行数据。

基于类似思路,执行器会根据查询优化器生成的一套执行计划,不停地调用存储引擎的各种接口去完成SQL语句的执行计划,从而不停地更新或者查询获取数据。

总结:MySQL驱动 -> 数据库连接池 -> 网络IO线程 -> SQL接口 -> 查询解析器 -> 查询优化器 -> 执行器 -> 调用存储引擎接口

SQL的执行流程:

一.由MySQL工作线程去监听网络请求和读取网络连接的SQL数据;

二.MySQL工作线程读取出SQL语句后会转交给SQL接口去执行;

三.通过查询解析器Parser解析SQL语句让MySQL能看得懂SQL逻辑;

四.通过查询优化器Optimizer选择最优的查询路径;

五.由执行器按照查询优化器选择的执行计划不停调用存储引擎接口;

六.存储引擎接口会查询内存缓存数据、查询磁盘数据、更新磁盘数据等;

相关推荐
难以触及的高度11 分钟前
mysql中between and怎么用
数据库·mysql
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
无敌岩雀3 小时前
MySQL中的索引
数据库·mysql
安迁岚4 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验六 视图
数据库·sql·mysql·oracle·实验报告
xoxo-Rachel4 小时前
(超级详细!!!)解决“com.mysql.jdbc.Driver is deprecated”警告:详解与优化
java·数据库·mysql
JH30735 小时前
Oracle与MySQL中CONCAT()函数的使用差异
数据库·mysql·oracle
路有瑶台6 小时前
MySQL数据库学习(持续更新ing)
数据库·学习·mysql