mysql架构--论一条sql是如何执行的

2021/6/18 2:05:28

本文主要是介绍mysql架构--论一条sql是如何执行的,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在这里插入图片描述

首先mysql 分3个部分 第一部分是客户端,第二部分是server端,第三部分是引擎层,引擎层采用插拔式,像我们目前常见的比较多的就是InnerDb/myIsam
server层主要包括这么几个部分,第一部分是连接器。
连接器是干嘛的,客户端要和服务端建立连接,然后你才能发sql过来,底层也是基于tcp通讯方式,所以mysql里面有一个连接器 去负责包括你的客户端的连接的建立和断开,第二就是你要连我服务器,我要建立一个安全的校验,比如你是不是一个安全的ip,
你的用户是否具备 连接的权限 以及你的账号密码是否正确之类,或者说 你是否具备insert  update delete select 的权限.
1>连接 
通过命令 mysql-uroot- p
然后我们就连接到我们的mysql的服务端 ,通过连接器去进行连接的建立以及权限的校验,
他在连接的过程中会拿你的host,user,pwd去user表中比对账号的正确以及权限是否具备。

在这里插入图片描述

当进行连接成功后,每一个连接连到我服务端,mysql 都会开一个专属这个连接的会话,这个空间是干嘛的,就是你这个连接执行的很多操作 比如说insert,update这些语句,都会存储在这个空间中,并且会把这个用户他的权限也缓存进这个会话中
这个客户端每一次往服务端发语句 比如说insert  select update 这些语句每一次都会去校验这个客户端的权限是否够 , 所以在他第一次连接的时候会吧这个用户的权限缓存到这个内存空间中	,连接建立好之后  8个小时如果你不干任何操作 这个连接依然会维持在这里,如果超过8个小时连接就断了
连接已经建立好了 此时再修改user表[如果不重新建立连接的话]中是没有用的


在这里插入图片描述

我们可以通过 show processList  查看有多少个当前的服务端有多少个连接 ,并且这些连接都在干嘛, 是在执行语句还是在什么都不操作 ,比如说此时有3个客户端连接我mysql, 并且有2个什么都不操作, 有一个正在执行查询操作,
如果这个连接什么都不干 默认最大停留8个小时  超过8个小时 自动关闭
我可以手动停止这些连接 kill 29

在这里插入图片描述

假设此时我发了一个select * from table where id=1;的语句 mysql服务层有一个缓存,如果从缓存中查找到了 ,他就不会去磁盘文件中找了,而是直接返回,如果在缓存中找不到的话 就会去磁盘文件中去找进而缓存到缓存中
这个缓存默认是关闭的, 我们可以开启

在这里插入图片描述
在这里插入图片描述

当我们表中没有 id=18 的这条记录 
当我们 使用select SQL_CACHE * FROM table where id=18 的时候
他就会从我们的表中查出来 放到缓存中 此时 Qcache_inserts 就会加1  代表此时缓存加1 

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

此时缓存中已经有这个sql的执行结果了 当我们再次使用同样的sql 查询的时候就会走缓存

在这里插入图片描述

Qcache_hits  +1 代表缓存命中1 
但是当我们这条数据已经在缓存中了 此时在表中更改这条数据之后 ,我们此时再查询的时候 还是从表中查询的 也就是  Qcache_inserts 就会加1  
所以这个缓存是比较鸡肋的
把这个放入缓存之后
如果我吧这个改了 ,查完之后 马上update 之后,你此时 下一次再查询的时候我是应该走磁盘呢 还是走缓存.此时肯定走磁盘 而不是走缓存 了 因为此时缓存中是脏数据阿
此时再查询的话 原来缓存中的数据就是脏数据 此时你再查的话就是走磁盘 而不是走缓存
分析器 一旦你的查询语句没有命中缓存  就开始真正执行语句了,
首先 要通过词法分析器来分析你这个语句是否正确,比如说这个语句 如果写错了
比如说 select * fro x where  他会报错
他会根据分析器来分析你这个语句是否会报错,如果没有异常 他会把这个sql进行拆分 ,拆分一个一个词干 就类似于es中的分词一样,把一个select语句构建成一个语法树,
优化器 在你构建树之后 我就可以提取出来条件字段 比如说where字段以及条件字段,优化器会选择到底使用那个索引会快一些,选择那个索引,或者走那个索引来执行这个sql 是优化器来定义的,
执行器,在优化器选择索引之后,执行器就会调用对应的引擎,如果表使用的innerDb引擎,优化器就会去调用innerDb引擎,innerDb就开始如果有索引就开始索引查询,从磁盘中读数据,然后把数据返回出去


这篇关于mysql架构--论一条sql是如何执行的的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程