首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL中执行SQL的流程

前两天,像我提出一个问题,他说,一条sql语句的执行流程是什么样子的?在mysql内部分别使用了哪些组件?趁着今天空,我我就把一条sql语句的执行流程整理了出来,其中涉及连接池、sql接口、sql解析器、查询优化器和执行引擎等。

首先举个例子,假如用户执行以下sql,,那么它的执行过程如图下所示:

selectid,name,agefromuserswhereid=1

MySQL中执行SQL的流程 - 程序员古德

从图上可以看到,用户发起一个请求到tomcat服务器,在tomcat中会创建一个线程,这个线程负责用户的请求和数据处理,并从数据库连接池中获得数据库链接,然后通过这个数据库链接连接到mysql数据库,执行sql语句时,先到连接池中获取连接,然后到MySQL服务器执行查询。

问题

MySQL中谁去处理这些网络请求?

MySQL服务器中谁负责从这个连接中去监听这个网络请求?谁负责从网络连接里把数据读出来?其实大家都知道,网络连接必须得分配一个线程去处理,由一个线程来监听和读取请求数据,那么MySQL服务器也是启动一个线程从网络连接中读取和解析出来一条发过去的sql语句,如下图所示:

MySQL中执行SQL的流程 - 程序员古德

MySQL中如何执行sql语句?

接着我们思考一下,当MySQL内部的工作线程从一个网络连接中读取出来一个sql语句之后,此时会如何执行这个sql语句呢?要执行这个sql,去完成底层的数据增删改查,其实是一项极其复杂的任务。MySQL内部首先提供一个组件SQL接口(SQL Interface)SQL接口(SQL Interface)是一套执行sql语句的接口,专门用于执行应用系统发送给MySQL的那些增删改查的sql语句。

因此MySQL工作线程接收到SQL语句后,就会转交给SQL接口去执行,如下图:

MySQL中执行SQL的流程 - 程序员古德

sql解析器

MySQL怎么看懂和理解这些SQL?比如这一条sql语句select id,name,age from users where id=1,我们人脑处理一下,只要懂SQL语法的人,立马就明白什么意思了。但是MySQL是一个数据库管理系统,它是没法直接理解这些SQL语句的。此时就有一个关键组件出场了,sql解析器。

sql解析器(Parser)的职责是对SQL语句进行解析,比如对上面那个sql语句进行拆解,可以拆解为以下几部分:

1、要从users表里查询数据

2、查询id字段等于1的那行数据

3、从查询出来的那行数据里提取id,name,age三个字段

所谓的SQL解析,就是按照既定的sql语法,对我们编写的sql语句进行解析,然后理解这个sql语句要干什么事情,如下图所示:

MySQL中执行SQL的流程 - 程序员古德

查询优化器

当通过sql解析器理解了sql要干什么之后,并不是马上去执行,而是要通过查询优化器(Optimizer)来选择一个最优的查询路径。就以上面那个sql查询为例,来看下所谓最优查询路径是什么。要完成这个事,我们有以下几个查询路径:

1、查询路径1:直接定位到users表中的id字段等于1的那一行数据,然后取那行数据的id,name,age三个字段值就行了。

2、查询路径2:先把users表中每一行数据的id,name,age三个字段的值都查出来,然后从这批数据里过滤出id字段等于1的那行数据。

上面就是一个最简单的SQL语句的两种实现路径,要完成这个sql语句的目标,两个路径都可以做到,但哪一种更好呢?显然感觉上第一种查询路径更好一些。所以查询优化器就是针对你编写的几十行、几百行甚至上千行的复杂sql语句生成查询路径树,然后从里面选择一条最优的查询路径出来。相当于他告诉sql执行器,按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步把SQL语句就完成了。

MySQL中执行SQL的流程 - 程序员古德

存储引擎

数据库就是一个编程语言写出来的系统而已,然后启动之后也是个进程,执行池里面的各种代码,也就是我们上面所说的那些东西。所以对数据库而言,我们的数据要不然是放在内存里,要不然是放在磁盘文件里,没什么特殊的地方!所以我们来思考一下,假设我们的数据有的存放在内存里,有的存放在磁盘文件里如下图所示。

MySQL中执行SQL的流程 - 程序员古德

那么问题来了,我们执行的时候是先更新内存数据?还是磁盘数据?我们如果先更新磁盘数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?这个时候就需要存储引擎了。存储引擎其实就是执行sql语句的核心组件,它会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据等等,执行一系列数据的操作,如下图所示:

MySQL中执行SQL的流程 - 程序员古德

MySQL的架构设计中,SQL接口、SQL解析器、查询优化器都是用的一套组件。但是存储引擎像插件一样,支持各种各样的存储引擎的,比如我们常见的InnoDB、MylSam、Momery等。我们可以自由选择哪种存储引擎来负责具体的SQL执行。不过现在大家一般都使用InnoDB作为MySQL的存储引擎。

执行计划

那么看完存储引擎之后,我们知道存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么是谁来调用存储引擎的接口呢?其实我们现在还漏了一个执行器的概念,这个执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取usrs表中的第一行数据,然后判断一下这个数据的id字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取users表的下一行数据。

就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据 出来。如下图所示:

MySQL中执行SQL的流程 - 程序员古德

总结

我们再来总结下MySQL的执行流程:

用户发起请求到tomcat服务器,tomcat服务器中线程开始执行sql 语句

线程从数据库的连接池中获取一个连接,建立与MySQL数据库服务器的连接

MySQL的工作线程接收到SQL语句后,转交给SQL接口去执行,sql接口将sql传递到sql解析器

sql解析器对SQL进行语法拆解,理解这个SQL要干什么,然后将sql传递给查询优化器

查询优化器选择最优的查询路径,生成SQL的执行顺序和步骤,然后将sql交给执行计划

执行计划将sql执行计划交给底层的存储引擎接口去执行,他按照一定的步骤去查询内存数据、更新磁盘数据等等。

执行过程如下图所示:

MySQL中执行SQL的流程 - 程序员古德

完!!!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OGB_2YR8hoHtX7NPm0_FTu7w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券