一. 一条SQL语句的执行顺序
**mysql的体系结构**
![在这里插入图片描述](https://img-blog.csdnimg.cn/201910211854373.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQzOTUzMw==,size_16,color_FFFFFF,t_70)
整个mysql server由下列组件组成:
-
connection poll:链接池组件
-
management services & utilities:管理服务和工具组件
-
sql interface:SQL接口组件
-
parser:查询分析器
-
optimizer:优化器
-
caches & buffers:缓冲池组件
-
pluggable storage engines:存储引擎
-
file system:文件系统
-
file & logs:日志系统
-
连接层:
是一些客户端连接服务 主要完成一些类似于连接处理, 授权认证 及相关安全方案,
在该层引入线程池,为通过认证安全接入的客户端提供线程. -
服务层:
主要完成大多数核心服务功能. 比如 SQL接口,完成缓存查询.SQL分析和优化. -
引擎层:
负责MYSQL中数据的存储和读取服务 -
存储层:
主要讲数据存储在文件系统上,并完成与存储引擎的交互.
重要组件解释
**查询缓存组件:**
查询缓存主要用来缓存我们所执行的select语句以及该语句的结果集.
执行查询语句时,先查询缓存,MYSQL会先校验这个SQL是否执行过, 以key-value的形式缓存在内存中, key为SQL语句, value为查询出来的结果集.
查询时,如果缓存key被命中,则把value返回给客户端,如果没有命中,则执行后续操作后,把结果集缓存起来.
MYSQL不建议使用缓存, 因为如果表数据被频繁更新,那么表的所有查询缓存都会被清空,这样延长了查询时间,不利于业务.
**分析器:**
没有命中缓存的话,SQL语句就会经过分析器,分析器主要用来分析SQL语句是干嘛的
第一步: 词法分析,一条SQL语句有多个字符串组成,首先要提取关键字,,比如select,提出查询的表.字段名,查询条件
第二步: 语法分析,主要判断输入的SQL语句是否正确,是否符合MYSQL语法.
**优化器:**
按照MYSQL自认为的最优方案执行SQL语句(并不一定是最优)
**执行器:**
当选择了执行方案后,MYSQL就准备开始执行了, 首先执行前会校验用户是否有权限,如果没有则返回错误信息,如果有则调用引擎接口,返回接口执行的结果.
语句分析
SQL分为两种:
查询
更新(增加,修改,删除)
查询分析
select * from student where age = 18 and name = “张三”;
执行流程
1. 检查该语句是否有权限,如果没有则抛出错误信息
2. 查询缓存,如果有则直接返回结果.(版本8.0以前)
3. 分析器进行词法分析,提取SQL语句关键元素
4. 优化器确定执行方案.
根据上述的SQL语句,优化器会确定两种方案:
1.先查询满足age为18的所有记录,然后在查询的结果集中再次筛选 name 为张三的结果集.
2.先查询满足name为张三的所有记录,然后在查询的结果集中再次筛选age为18的结果集
5. 权限校验,如果有则调用存储引擎接口,返回引擎执行的结果
权限校验---> 查询缓存---> 分析器---> 优化器---> 权限校验---> 执行器---> 引擎
更新分析
insert into student values (null,“李四”,20);
执行流程
1. 检查该语句是否有权限,如果没有则抛出错误信息
2. 查询缓存,如果有则直接返回结果.(版本8.0以前)
3. 分析器进行词法分析,提取SQL语句关键元素
4. 优化器确定执行方案.