一条sql走过的路是怎么样的?

        最近一直在mysql数据库这一块继续学习和总结;继续内卷,😁

        本次总结主要是关于一条sql语句从开始到执行完的过程是怎么样的;

        以前自己在写一些简单的sql语句的时候,没怎么关心过在底层到底是怎么执行的,但是学技术学底层是非常有必要的,所以今天就一条sql是怎么走完它的一生的,做一个小总结;

首先看图:

在结构上可以分为三层:

  1. 客户端

  2. Server层

  3. Store层(引擎层)

在操作mysql数据库之前,首先要登录建立连接,在每次连接成功之后系统就会开辟出一个session,可以理解为是一个系统回话空间(临时的);

他的作用就是连接执行时候的很多操作,并且会把用户的权限放在这个会话空间;会有一个user表,会将user信息load到会话中,每一个执行select或者其他语句都会校验权限,一般会建立长链接,8个小时过期(上面那一排字段就包含了权限名称,下面就是每个人的权限具体情况,Y就是Yes,N就是No)

举一个栗子,可能就更容易明白了,假如突然修改表中的user的密码y自己权限,是不会马上更新到会话中的,需要重新登录,重新缓存到session中;

   开始说流程,建议结合图片观察:

举个例子,一条sql语句;

SELECT * FROM test;

1.首先会尝试先找缓存,有缓存的话直接读取缓存,不过有一点需要注意,在5.7版本之后就没有缓存这个功能了,因为有一些鸡肋,但是5.7之前仍然是可以用的,需要修改一些配置;

修改的方式:

关闭缓存:

query-cache-type 0

开启缓存:

query-cache-type 1

选择性开启,代表 语句中有SQL.CACHE关键字才会有用;

query-cache-type 2

比如:select SQL_CACHE from test where ID=5;

缓存的形式就类比于key-value的形式缓存在查询缓存中,key就是sql语句,value就是查询出来的内容;

为什么说有些鸡肋呢,因为这种机制只适合那种几乎万年不变的sql语句需求,比如说系统配置表,应用场景很受限制;

2.继续衔接第一步,假如击中缓存了,就开始真正执行语句;

3.经过词法分析器,分析语句中的语法是否符合规范,比如一个sql语句

select*fro test;(此处的from少了个m),经过了词法分析器分析之后,就会把sql语句进行拆分,拆分成一个树型的结构(此处可以尝试一下使用一个idea的插件,ANTLRVL,这个插件可以将sql树型可视化处理);

4.然后经过优化器,优化器是在一个表中有多个索引的时候,决定优先使用哪一个索引,或者有多表关联时,决定各个表连接顺序;

5.执行器 调用引擎,至此,一个sql执行结束;

至此补充一下,了解sql的执行流程有利于深入总结sql优化的工作,但是相比sql优化模块而言,实战指导意义偏弱一些,所以精力有限情况下,建议多花些时间在索引优化,sql优化的工作和学习上;

    

        最后以一个面试题作为收尾,并且把刚总结的做一个大白话的串讲:

        问:请说说一条sql的执行过程;

        答:好的,嗯 我想一下,首先可以将执行分成三个部分,第一部分客户端,第二部分Server层,包括连接器,词法分析器,优化器和执行器,第三部分就是Store层 ,可以说是引擎部分,首先我们先建立数据库的连接,数据库中有一个用户表,

    里面储存了数据库操作员的一些数据和权限,连接器会创建连接并且校验用户和有哪些权限;然后sql就被词法分析器分析是否有语法问题,通过之后,经过优化器分析是否需要走索引,或者优先走什么索引,总之就是经过内部的一些计算得出,什么方式出结果最快就走什么方式,最后执行器执行,调用引擎的接口(一般是InnoDB 引擎),执行结束返回结果。在5.7版本之前,如果是第一次查询,就会将结果缓存下来,key是sql语句,value是查询出来的结果;然后后面假如又有同样的sql需求的时候,就会先走内存,内存没有值,再走上面的流程,您如果感兴趣的话,我可以给您讲讲主流的引擎InnoDB和myisam之间的区别,以及sql的优化;

        我继续肝数据结构于算法去了~

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值