1. 逻辑架构图

image.png
未命名文件.jpg

1.1 Connectors

这一层主要是像Java Go所编写的客户端程序

1.2 连接层

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

  • 如果账号密码不正确,则报出错误,同时,客户端程序结束执行。
  • 账号密码认证通过后,会从权限表中查询出用户对应的权限。

TCP连接收到请求以后,会分配一个线程专门和这个客户端进行交互,因此还会有一个线程池。

从线程池中去获取线程,省去了创建和销毁的线程的时间开销

1.3 服务层

  • SQL接口:
    • 用来接收用户的SQL命令,并返回执行SQL后的结果
  • 解析器:
    • 在解析器中对SQL语句进行语法分析、语义分析,将SQL语句拆分成数据结构,并将此数据结构传递给后续步骤执行。
    • SQL语句的错误一般是在解析的时候发现的
    • 在SQL命令传递到解析器的时候,解析器会为其创建语法树,如果有优化方案,MySQL还会对SQL查询的方法进行一定的优化
  • 查询优化器:
    • SQL语句在语法解析之后,查询之前会使用查询优化器确定SQL的执行方法,生成一个执行计划
    • 执行计划应该表明使用哪些索引进行查询、表之间的连接顺序如何。最后会按照执行计划中的步骤调用存储引擎提供的方法来执行真正的查询,并将结果通过SQL接口返回给用户
  • 查询缓存组件:
    • MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了,直接将结果反馈给客户端。
    • 缓存机制由一系列的小缓存组成,比如表缓存,记录缓存,key缓存等等
    • 查询缓存可以在不同的客户端之间进行共享。
    • 在MySQL5.7.20开始,不再推荐使用查询缓存,并在MySQL8.0中,此组件被删除

      1.4 引擎层

      MySQL的引擎层被称为:插件式存储引擎层,真正负责了MySQL数据的存储和读写,对维护在物理服务器上的底层数据执行操作

      1.5 存储层(文件层)

      MySQL的数据文件就存放在物理服务器的磁盘上

2. SQL执行流程