文章目录
- 前言:
- 一:执行一条select的概览
- 二:具体流程
- 1:连接器
- (1):步骤
- (2):浅浅来一下细节
- 2:查询缓存
- (1):mysql5.8之前的幸福时光
- (2):mysql5.8之后的悲惨结果
- 3:解析器(解析sql)
- (1):词法解析
- (2):语法解析
- 4.执行sql
- (1):预处理阶段
- (2):优化阶段
- (3):执行器
- (1):概述
- (2):三种方式
- a:主键索引查询
- b:全表扫描
- c:索引下推
前言:
不找工作的可能永远不知道今年找工作有多难 但还是乐观点 该学就学 该卷就卷 慢慢跟自己和解 终归会有offer的
一:执行一条select的概览
首先来一个概览
在这里的话整个select的过程分为两层server层储存引擎层
- server层负责建立连接,分析和执行sql
- 储存引擎层负责数据的储存跟提取
二:具体流程
1:连接器
(1):步骤
- 与客户端进行 TCP 三次握手建立连接;
- 校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
- 如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;
(2):浅浅来一下细节
- 在连接的时候 我们要确保我们的mysql服务是启动的
- 还有的是我们创建连接的时候我们创建的是长连接(没错在这里也分为长连接跟短链接 因为使用常连接的话 能避免我们频繁的创建跟断开连接) 但是长连接的话 往往比较占内存 mysql里的话采用的解决的策略的话是 定期断开长连接 跟 客户端主动断开连接
2:查询缓存
(1):mysql5.8之前的幸福时光
既然是缓存那肯定是把一些会重复访问的数据放到缓存中去 从而减少IO次数,提升性能.(往缓存中进行第一次添加数据 是我们已经在查询出来了一次结果 将其返回给客户端 并且将其储存在缓存当中方便下次再次查询的时候直接拿出来),缓存中的储存值的方式是key-value 就是将我们的sql语句设置为key 将我们上次查询出来的结果设置为value.如果没在缓存中查询到 那么我们就接在往下执行 等查询到结果后返回客户端同时在缓存中备份。
(2):mysql5.8之后的悲惨结果
那么这个缓存最大缺点就是我们需要频繁的更新 每当我们update一次的时候 就需要 清空缓存 那么的话 就会出现一个问题 我们刚创建好缓存,但是还没怎么用 就被一条update语句给清空了 那么想问是这个缓存存在意义是啥 ,出于这个原因的话 在mysql8.0之后 mysql中就没有了缓存。
3:解析器(解析sql)
(1):词法解析
mysql 根据你输入的sql遇语句解析出关键字,将关键字组成语法树,这样方便后续模块获取SQL模型,表名,字段名,where条件等
(2):语法解析
根据词法解析出来的结果,语法解析器主要干的就是查询你的sql语法是否正确。但要注意的是敲黑板了 关于sql语句中的字段是否存在表名是否存在 不是在这里检查出来的 是在下面的环节进行检查出来的(执行器的 预处理阶段)
4.执行sql
(1):预处理阶段
预处理阶段比如 我们查询的是select * … 在预处理阶段的话 那么的话 我们的需要将 这个 * 所代表的的一些字段给展示出来, 同时会检查字段的是否存在以及表名的是否存在。
(2):优化阶段
在优化阶段的话,比如我们在这个表中建立了多个索引,那么我们在执行的sql语句的时候 肯定要选择执行效率最高的那个作为索引进行查询我们的结果。 我们可以用 explain + sql语句 来看看我们的sql语句使用了什么索引
(3):执行器
(1):概述
经历完优化器后,就确定了执行方案,接下来 MySQL 就真正开始执行语句了,这个工作是由「执行器」完成的。在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;
(2):三种方式
a:主键索引查询
b:全表扫描
就是查询条件不是索引的话 那么就会全表扫描,那么的话效率低下,每次查询结果都返回给server判断结果是否正确
c:索引下推
「下推」这个动作,下推到了哪里。索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,
然后进行判断where条件是否符合 如果不符合储存引擎再进行查询。