MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池

文章目录

  • 一、逻辑架构
    • 1.1 第一层:连接层
    • 1.2 第二层:服务层
    • 1.3 第三层:引擎层
    • 1.4 存储层
    • 1.5 小结
  • 二、SQL执行流程
    • 2.1 查询缓存
    • 2.2 解析器/分析器
    • 2.3 优化器
    • 2.4 执行器
    • 2.5 小结
  • 三、数据库缓冲池(buffer pool)
    • 3.1 缓冲池 vs 查询缓存
      • 缓冲池
      • 查询缓存
    • 3.2 缓冲池如何读取数据

一、逻辑架构

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第1张图片

逻辑架构图

1.1 第一层:连接层

客户端访问MySQL服务器前首先要建立TCP连接

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

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

1.2 第二层:服务层

  • SQL Interface: SQL接口
  • 接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT … FROM就是调用SQL Interface
  • Parser: 解析器
  • 解析器对SQL语句进行语法、语义分析。将SQL语句分解为数据结构
  • SQL接口将SQL命令传进解析器时,将其解析并创建语法树,会根据数据字典丰富查询语法树
  • 创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。
  • Optimizer: 查询优化器
  • SQL语句在语法解析之后、查询之前会使用查询优化器确定SQL语句的执行路径,生成一个 执行计划
  • 执行计划表明应该使用哪些索引进行查询,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询
  • Caches & Buffers: 查询缓存组件
  • 查询缓存将缓存一条SELECT语句执行的结果,如果两次查询语句完全一样就命中缓存,不用再去存储文件里查了
  • 注意:查询缓存必须两条语句完全一样才会命中
  • 在MySQL5.7.20开始,不推荐使用查询缓存,在MySQL 8.0中删除

1.3 第三层:引擎层

插件式存储引擎层( Storage Engines), 真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作 ,不同的存储引擎有不同的功能

常见的有:MyISAM,InnoDB,Memory

1.4 存储层

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

当然有些存储引擎比如InnoDB,也支持不使用文件系统直接管理裸设备,但现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以使用本地磁盘,可以使用 DAS、NAS、SAN 等各种存储系统。

1.5 小结

架构可以简化为下图:

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第2张图片

简化的三层结构:

  1. 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
  2. SQL 层(服务层):对 SQL 语句进行查询处理;与数据库文件的存储方式无关;
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取。

二、SQL执行流程

如图:

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第3张图片

2.1 查询缓存

大多数情况查询缓存就是个鸡肋。因为MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果。

这就意味着:两个查询请求在任何字符上的不同(例如:空格、注释、 大小写),都会导致缓存不会命中。因此 MySQL 的查询缓存命中率不高,就是个鸡肋

2.2 解析器/分析器

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

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第4张图片

  • 分析器先做词法分析。对你输入的多个字符串组成的SQL语句进行分析,识别出每个字符串分别是什么,代表什么。例如:吧"select"这个关键字识别出来

  • 分析器接下来做语法分析。语法分析器根据语法规则判断你的SQL是否满足MYSQL的语法,如果正确,就会返回一颗语法树:

    MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第5张图片

2.3 优化器

在优化器中会确定 SQL 语句的执行路径,比如是根据 全表检索 ,还是根据 索引检索

优化器中有逻辑优化物理优化

举例:

select * from test1 join test2 using(ID)
where test1.name='zhangwei' and test2.name='mysql高级课程';

方案1:可以先从表 test1 里面取出 name='zhangwei’的记录的 ID 值,再根据 ID 值关联到表 test2,再判 断 test2 里面 name的值是否等于 ‘mysql高级课程’。

方案2:可以先从表 test2 里面取出 name=‘mysql高级课程’ 的记录的 ID 值,再根据 ID 值关联到 test1, 再判断 test1 里面 name的值是否等于 zhangwei。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

2.4 执行器

截止到现在,还没有真正去读写真实的表,仅仅只是产出了一个执行计划。于是就进入了执行器阶段

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第6张图片

在执行之前需要判断该用户是否 具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

2.5 小结

SQL 语句在 MySQL 中的流程是: SQL语句→查询缓存→解析器→优化器→执行器

image-20220210161842326

三、数据库缓冲池(buffer pool)

InnoDB存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作实际上是在访问页面。

我们都知道磁盘IO需要消耗很多时间,在内存中操作效率就会高得多。如果我们可以在内存中进行修改,然后再写入磁盘,这样效率会高得多。

为了实现这种方式 ,DBMS 会申请 占用内存来作为数据缓冲池 ,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问。这样做的好处是可以让磁盘活动最小化,从而 减少与磁盘直接进行 I/O 的时间

3.1 缓冲池 vs 查询缓存

缓冲池和查询缓存是一个东西吗?不是。

缓冲池

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第7张图片

缓冲池包括了数据页、索引页、插入缓冲、锁信息、自适应 Hash 和数据字典信息等。

缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响

查询缓存

查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。

查询缓存条件苛刻,命中率低

3.2 缓冲池如何读取数据

缓冲池管理器会尽量将经常使用的数据保存起来,在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

MySQL深入学习 --- mysql逻辑架构,SQL的执行流程,数据库缓冲池_第8张图片

问:如果我们执行 SQL 语句的时候更新了缓存池中的数据,那么这些数据会马上同步到磁盘上吗?

答:不会,执行SQL语句首先会更新缓冲池上的内容,然后mysql后台会有一个线程按一定的频率将页面刷入硬盘中

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