面试官:请问一条select的语句的执行会发生什么?


文章目录

  • 前言:
  • 一:执行一条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的语句的执行会发生什么?_第1张图片
在这里的话整个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语句使用了什么索引

面试官:请问一条select的语句的执行会发生什么?_第2张图片

(3):执行器

(1):概述

经历完优化器后,就确定了执行方案,接下来 MySQL 就真正开始执行语句了,这个工作是由「执行器」完成的。在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位的。根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

(2):三种方式

a:主键索引查询

b:全表扫描

就是查询条件不是索引的话 那么就会全表扫描,那么的话效率低下,每次查询结果都返回给server判断结果是否正确

c:索引下推

「下推」这个动作,下推到了哪里。索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,
然后进行判断where条件是否符合 如果不符合储存引擎再进行查询。

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