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

大纲

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选择最优的查询路径;

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

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

#牛客创作赏金赛#
MySQL底层原理与应用 文章被收录于专栏

MySQL底层原理与应用

全部评论

相关推荐

点赞 4 评论
分享
牛客网
牛客企业服务