1、MySQL逻辑架构简介

MySQL在逻辑架构上,大致分为三层:

  • 连接层
  • 服务层
  • 引擎层

当然,在连接层之前会有客户端发送请求过来,可称为客户端连接层,在引擎层之下,还可以说有一层存储层。

2、服务器处理客户端请求的过程

image.png
image.png

3、Connectors

这是客户端层、或者说客户端连接层,通过JDBC等方式连接MySQL。

4、连接层

客户端访问MySQL服务器前,做的第一件事就是建立连接,建立的是TCP连接。
经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。

  • 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行。
  • 用户名密码认证通过,会从权限表中查出账号拥有的权限与连接关联,之后的权限判断逻辑,都依赖于此时读到的权限。

TCP接收到请求后,必须要分配一个线程专门与这个客户端交互。所以还会有个线程池,去走后面的流程。每一个连接都从线程池中获取线程,省去创建和销毁线程的开销。

可以看出,连接层涉及:

  1. 客户端和MySQL进行连接和通信,是基于TCP协议的;
  2. MySQL驱动在底层帮我们做了对数据库的连接,只有建立了连接,才可以发送SQL语句执行操作;
  3. 每个请求都会建立一个连接,吗,每个连接都需要分配线程来进行与客户端的交互。而频繁创建线程和销毁线程,会有很大的浪费和性能下降,因此连接层提供了一个线程池。这个线程池就是数据库连接池。

—> 数据库连接池:
数据库连接池维护一定的连接数,方便系统获取连接,避免了连接(也就是处理连接的线程)的频繁的创建与销毁。
我们的web系统一般部署在tomcat中,tomcat可以并发处理多个请求;web短通过tomcat配置的常用的数据库连接池(Druid、C3P0、DBCP等),请求连接到mysql的数据库连接池。
也就是:Web配置的数据库连接池 去连接 MySQL连接层的数据库连接池
这样一来,不需要争抢连接,提高了并发性能;且减少了反复创建和销毁线程的消耗。
image.png

5、服务层

服务层包括了这几个部分:SQL Interface(SQL接口)、Parser(解析器)、Optimizer(查询优化器)、Caches&Buffers(查询缓存组件)。
SQL Interface(SQL接口):

  • 负责接收用户的SQL命令,并返回SQL操作的结果。SELECT … FROM … 就是调用SQL接口。
  • MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口。

Parser(解析器):

  • SQL是以字符串的形式传过来的,要将SQL语句解析成MySQL能够识别的语言。
  • 在解析器中对SQL语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在解析中遇到错误,那么说明这个SQL语句是不合理的。
  • 在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建语法树。

解析器执行步骤:

  1. 词法分析:将整个语句拆分成一个个字段;
  2. 语法分析:将词法分析拆分出的字段,按照MySQL定义的语法规则,生成对应的数据结构解析树。
  3. 解析树:

image.png

  1. 预处理器:进一步检查解析树是否合法,比如去查看表是否存在,列是否存在。
  2. 通过预处理器核对之后生成新的解析树,新解析树可能和旧解析树结构一致。

Optimizer(查询优化器):
MySQL根据自己的优化规则,将查询到IO成本和CPU成本消耗降到最低。

  • SQL语句在语法解析之后,查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划。
  • 这个执行计划标明应该使用哪些索引进行查询,表之间连接顺序如何。例如调换where条件位置,使索引满足最佳左前缀法则。最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将结果返回给用户。
  • 查询优化器使用“选取-投影-连接”策略进行查询。例如:

SELECT id、name FROM student WHERE gender = ‘女’;
这个SELECT查询先根据WHERE语句进行选取,而不是将表全部查询出来以后再进行gender过滤;先根据id和name进行属性投影,而不是将属性全部取出以后再进行过滤。将这个两个查询条件连接起来生成最终查询结果。
Caches&Buffers(查询缓存组件):

  • MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了。
  • 这个查询缓存可以在不同客户端之间共享。
  • MySQL8.0中删除了缓存机制。

    6、引擎层

    引擎层使用插件式的存储引擎,真正负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。
    不同的存储引擎具有不同的功能,我们可以根据实际需要进行选择。

    7、存储层

    所有的数据,以及数据库和表的定义,表的每一行的内容,索引等,都是存在文件系统上,以文件的方式存在的,并完成与存储引擎的交互。

8、小结

image.png