MYSQL逻辑架构

文章目录

  • MYSQL逻辑架构
    • 1. 逻辑架构剖析
      • 1.1.1 MYSQL的逻辑架构---三层
      • 1.1.2 连接层---第一层
      • 1.1.3 服务层---第二层
      • 1.1.4 引擎层---第三层
    • 2 服务器处理客户端请求---三部分

MYSQL逻辑架构

1. 逻辑架构剖析

1.1.1 MYSQL的逻辑架构—三层

MYSQL逻辑架构:一共三层。下图针对MYSQL5.0,在MYSQL8.0中没有了Cache&Buffers查询缓存。具体展开如下图:

  • 连接层Connection Pool获取MYSQL服务层连接

  • 服务层(核心):SQL Interface(SQL接口)、Parser(解析器)、Optimizer(优化器)、Cache&Buffer(查询缓存-mysql5.0有)

  • 引擎层:Pluggable Storage Engines(插件式的存储引擎)
    MYSQL逻辑架构_第1张图片

    • MYSQL5.0中Cache&Buffers查询缓存:将查询结果以key-value的形式缓存key为sql语句value是查询结果。下次查询的sql和key完全一样,直接返回。
    • 插件式存储引擎:可以根据需要更换存储引擎与底层文件系统进行交互。

具体查询执行顺序:
MYSQL逻辑架构_第2张图片

  1. MYSQL客户端程序发起连接
  2. 利用连接池建立连接,并分配线程处理请求
  3. SQL接口:接收SQL指令
  4. MYSQL5.0:查询缓存,有key直接返回(MYSQL8.0中没有这一步
  5. 缓存中没有,则在解析器中进行sql解析,并生成语法树
  6. 核心:在优化器中进行逻辑优化或物理优化物理索引是指使用索引。sql语句在语法解析之后、查询之前会使用查询优化器确定sql语句执行路径,生成一个 执行计划
  7. 调用对应的API,即存储引擎
  8. 文件系统中进行查找(会先将物理层文件加载到内存中buffer库缓冲池,直接与磁盘交互代价太大)
  9. MYSQL5.0:将查询结果已key-value形式缓存到查询缓存
  10. 最后,通过SQL接口将查询结果返回到连接池,再返回到客户端

1.1.2 连接层—第一层

连接层Connection Pool获取MYSQL服务层连接

  • 系统(客户端)访问 MySQL 服务器前,做的第一件事就是 建立 TCP 连接

  • 经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取

    • 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
    • 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
  • TCP 连接收到请求后,必须要 分配给一个线程 专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。

1.1.3 服务层—第二层

服务层(核心):SQL Interface(SQL接口)、Parser(解析器)、Optimizer(优化器)、Cache&Buffer(查询缓存-mysql5.0有)

  • SQL Interface: SQL接口

    • 接收用户的SQL命令,并且 返回用户需要查询的结果。比如SELECT … FROM就是调用SQL Interface
    • MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口
  • Parser: 解析器

    • 在解析器中对 SQL 语句进行 语法分析、语义分析

      将SQL语句 分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。

    • 在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建 语法树 ,并根据数据字典丰富查询语法树,会 验证该客户端是否具有执行该查询的权限

    • 创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写

  • Optimizer: 查询优化器

    • SQL语句在语法 解析之后、查询之前 会使用查询优化器确定 SQL 语句的执行路径,生成一个 执行计划

    • 这个执行计划表明应该 使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序 如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将
      查询结果返回给用户。

    • 它使用“ 选取-投影-连接 ”策略进行查询。例如:

      SELECT id,name FROM student WHERE gender = '女';
      

      这个SELECT查询先根据WHERE语句进行选取 ,而不是将表全部查询出来以后再进行gender过滤。 这个SELECT查询先根据id和name进行属性 投影 ,而不是将属性全部取出以后再进行过滤,将这两个查询条件 连接 起来生成最终查询结果。

  • Caches & Buffers: 查询缓存组件(mysql5.0有,mysql8.0无)

    • MySQL内部维持着一些 Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了,直接将结果反馈给客户端。
    • 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 。
    • 这个查询缓存可以在 不同客户端之间共享
  • 从MySQL 5.7.20开始,不推荐使用查询缓存,并在 MySQL 8.0中删除 。

1.1.4 引擎层—第三层

引擎层:Pluggable Storage Engines(插件式的存储引擎)

  • 真正的负责了MySQL中数据的存储和提取,对 物理服务器级别维护的底层数据执行操作,服务器通过 API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
  • MySQL 8.0.25默认支持的存储引擎如下:查询引擎语句:show engines; MYSQL逻辑架构_第3张图片

2 服务器处理客户端请求—三部分

MYSQL是典型的C/S架构,即Client/Server架构,服务器端程序使用的mysqld。

不论客户端进程和服务器进程采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(SQL语句)服务器进程处理后再向客户端进程发送一段文本(处理结果)

服务器进程对客户端进程发送的请求处理过程如下图:MYSQL逻辑架构_第4张图片

  • 连接管理处理客户端连接,如用户名密码校验、权限校验
  • 解析与优化解析查询语句,对sql进行优化处理
  • 存储引擎调用存储引擎,对物理层文件查找(会先将物理层文件加载到内存中buffer库缓冲池,直接与磁盘交互代价太大)

你可能感兴趣的:(mysql,架构,数据库)