【MySQL】一、MySQL的架构设计
本文主要介绍MySQL数据库的整体架构设计
1.1 把MySQL当做黑盒子一样执行SQL语句
一般情况下,我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连接池,其中管理了系统跟这台数据库服务器简历的所有连接,如下图所示:
当我们的系统只要能从数据库连接池获取到一个数据库连接之后,我们就可以执行增删改查的SQL语句了。
从上图其实可以看到,我们可以通过数据库连接池把要执行的SQL语句发送给MySQL数据库,然后很多时候就把MySQL当做一个黑盒子来执行SQL语句。
1.2 网络连接必须让线程来处理
现在假设我们的数据库服务器的连接池中的某个连接接收到了网络请求,假设就是一条SQL语句,那么思考一下,谁负责从这个连接中去监听网络请求?谁负责从网络连接里把请求数据读取出来?
如果对计算机基础知识有一个简单了解的话,应该知道网络连接必须得分给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句,如下图所示:
1.3 SQL接口负责处理接收到的SQL语句
当MySQL内部的工作线程从一个网络连接中读取出来 一个SQL语句后,此时会如何来执行这个SQL语句呢?
MySQL内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删盖茶的SQL语句。
因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行,如下图:
1.4 查询解析器让MySQL能看懂SQL语句
当线程从网络请求中把SQL语句提供给SQL接口后,SQL接口如何理解这个SQL语句呢?
比如我们请求了下面一个SQL语句:
1 | select id, name, age from users where id = 1 |
这个SQL语句,我们用人脑是直接就可以处理一下,只要懂SQL语法的人,立刻就知道它是什么意思,但是MySQL自己本身也是一个系统,是一个数据库管理系统,他没办法直接理解这些SQL语句。
所以此时有一个关键的组件,就是查询解析器。
这个查询解析器就是负责对SQL语句进行解析的,比如对上面那个SQL语句进行一下拆解,拆解成以下几个部分:
- 我们要从”User”表里查数据
- 查询”id”字段的值等于1的那行数据
- 对查出来的那行数据要提取里面的”id,name,age”三个字段
所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情,如下图所示:
1.5 查询优化器选择最优的查询路径
当通过解析器理解了SQL语句要干什么之后,接着会查找优化器来选择一个最优的查询路径。
例如要查询上面提到的SQL,可以有以下几个查询路径:
- 直接定位到”users”表中的”id”字段等于1的一行数据,然后查出来那行数据的”id,name,age”三个字段的值就可以了。
- 先把”users”表中的每一行数据的”id,name,age”三个字段的值都查出来,然后从这批数据里面过滤出来”id”字段等于1 的那行数据的三个字段。
上面就是一个最简单的SQL语句的两种实现路径,要完成这个SQL语句的目标,两个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。所以查询优化器大概就是干这个的,他会针对你编写的几十行、几百行甚至上千行的复杂SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。
相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句给完成了。
1.6 调用存储引擎接口,执行SQL语句
最后一步就是把查询优化器选择的最优查询路径,也就是按照一个什么样的顺序和步骤去执行这个SQL的计划交给底层的存储引擎去真正的执行。
1.7 执行器,根据执行计划调用存储引擎的接口
存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么谁来调用存储引擎的接口呢?
执行器会根据优化器选择的执行方案,去掉用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。
【MySQL】一、MySQL的架构设计