逻辑架构-

一.逻辑架构解析

逻辑架构-_第1张图片

逻辑架构-_第2张图片

 

1. 连接层

系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。
经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。
TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
建立连接 --> 验证,获取权限 --> 连接成功分配线程

2. 服务层

2.1 SQL Interface: SQL接口

接受sql指令,返回查新结果

2.2 Parser: 解析器

词法分析,语法分析,生成语法树

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

SQL 命令传递到解析器的时候会被解析器验证和解析,并为其创建 语法树 ,并根据数据字
典丰富查询语法树,会 验证该客户端是否具有执行该查询的权限 。创建好语法树后, MySQL
会对 SQl 查询进行语法上的优化,进行查询重写。

2.3 Optimizer: 查询优化器

核心组件: 对sql语句经行优化

SQL 语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个
执行计划
这个执行计划表明应该 使用哪些索引 进行查询(全表检索还是使用索引检索),表之间的连
接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将
查询结果返回给用户。

2.4 Caches & Buffers: 查询缓存组件

MySQL 内部维持着一些 Cache Buffer ,比如 Query Cache 用来缓存一条 SELECT 语句的执行结
果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过
程了,直接将结果反馈给客户端
MySQL 5.7.20 开始,不推荐使用查询缓存,并在 MySQL 8.0 中删除

3. 引擎层(提取存储数据)

插件式存储引擎层( Storage Engines), 真正的负责了 MySQL 中数据的存储和提取,对物理服务器级别 维护的底层数据执行操作 ,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样 我们可以根据自己的实际需要进行选取。
show engines; //显示引擎;

4. 存储层

所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在 文件系统 上,以 文件 的方式存 在的,并完成与存储引擎的交互。当然有些存储引擎比如InnoDB ,也支持不使用文件系统直接管理裸设 备,但现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以使用本地磁盘,可以使用 DAS、 NAS SAN 等各种存储系统。

5. 小结

逻辑架构-_第3张图片

连接 ---> 处理sql语句 --> 执行sql语句

二. SQL执行流程

 逻辑架构-_第4张图片

1. 查询缓存 

Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没
有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能(以key(sql语句) value (结果)形式缓存的)
原因一: 必须与存储的sql语句一模一样才可以返回结果集,多个空格也不行, 因此 MySQL 查询缓存命中率不高
原因二: 如果调用同一个函数但结果不同比如NOW(),查询缓存的的结果就是错误的
原因三: 缓存失效,只要更新了缓存中的表,缓存就会失效
MySQL 的缓存系统会监测涉及到的每张表,只要该表的
结构或者数据被修改,如对该表使用了 INSERT UPDATE DELETE TRUNCATE TABLE   ALTER TABLE DROP TABLE DROP DATABASE 语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!对于 更新压力大的数据库 来说,查询缓存的命中率会非常低。

2. 解析器

在解析器中对 SQL 语句进行语法分析、语义分析。
1. 分析器先做 词法分析 。你输入的是由多个字符串和空格组成的一条 SQL 语句, MySQL 需要识别出里面的字符串分别是什么,代表什么。 MySQL 从你输入的 "select" 这个关键字识别出来,这是一个查询语句。它也要把字符串“T” 识别成 表名 T” ,把字符串 “ID” 识别成 ID”
识别关键字,表名等
2.  要做 语法分析 。根据词法分析的结果,语法分析器(比如: Bison )会根据语法规则,判断你输 入的这个 SQL 语句是否 满足 MySQL 语法
逻辑架构-_第5张图片

3. 优化器

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

逻辑架构-_第6张图片

4. 执行器

逻辑架构-_第7张图片

在执行之前需要判断该用户是否 具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。
逻辑架构-_第8张图片

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

逻辑架构-_第9张图片

三.MySQL8SQL执行原理 

 

select @@profiling;  //查看是否开启计划
开启可以收集sql执行时所使用的资源情况
profiling=0 代表关闭
set profiling=1; #打开

show profiles; # 显示最近的几次查询

show profile for query 7; 显示执行计划,查看程序的执行步骤

逻辑架构-_第10张图片

逻辑架构-_第11张图片 逻辑架构-_第12张图片

逻辑架构-_第13张图片 

四. MySQL5.7SQL执行原理

上述操作在 MySQL5.7 中测试,发现前后两次相同的 sql 语句,执行的查询过程仍然是相同的。不是会使用缓存吗?这里我们需要 显式开启查询缓存模式 。在 MySQL5.7 中如下设置:
逻辑架构-_第14张图片

逻辑架构-_第15张图片 

逻辑架构-_第16张图片 

逻辑架构-_第17张图片 

逻辑架构-_第18张图片 

 

 

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