最近一直在mysql数据库这一块继续学习和总结;继续内卷,😁
本次总结主要是关于一条sql语句从开始到执行完的过程是怎么样的;
以前自己在写一些简单的sql语句的时候,没怎么关心过在底层到底是怎么执行的,但是学技术学底层是非常有必要的,所以今天就一条sql是怎么走完它的一生的,做一个小总结;
首先看图:
在结构上可以分为三层:
-
客户端
-
Server层
-
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的优化;
我继续肝数据结构于算法去了~