欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql服务器处理客户端请求流程

程序员文章站 2022-06-03 08:37:51
在日常执行mysql语句的过程中,都是客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果). 看似很简单,其实不然,这内容有很多东西是需要注意的.下面借用两张图来说明,其实两张图表示的意思都是一样. 上面的图对于中间的解析和优化不是很透彻,下面 ......

在日常执行mysql语句的过程中,都是客户端进程向服务器进程发送一段文本(mysql语句),服务器进程处理后再向客户端进程发送一段文本(处理结果). 看似很简单,其实不然,这内容有很多东西是需要注意的.下面借用两张图来说明,其实两张图表示的意思都是一样.

Mysql服务器处理客户端请求流程

上面的图对于中间的解析和优化不是很透彻,下面的图将解析和优化说的更明确.

Mysql服务器处理客户端请求流程

接下来就分开说明下:

连接管理/连接器

连接器就是用来客户端和服务器进程之间建立连接的,这个方式有很多,比如说tcp/ip,命名管道或共享内存等等,这个阶段的连接需要客户端提供主机信息,用户名以及密码,服务器会对提供的信息进行认证,不仅仅是账户密码的匹配,还有权限的验证.

解析优化

解析优化阶段是非常重要的一个阶段,主要包括了查询缓存(8中取消),语法解析和查询优化.

查询缓存

这个的意思的mysql服务器程序处理请求,会把刚刚请求过的查询请求和结果缓存起来,,下一次有一模一样的请求过来,直接从缓存中查找结果会更快.如何缓存的呢?其实就是键值对的形式,键就是查询的sql语句,值就是查询出来的结果.

注意重点是一模一样,也就是出现虽然查询的结果一样,但是不会命中缓存的情况. 也就是两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。还有,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。

缓存什么失效呢? mysql的缓存系统会检测涉及到每张表,只要该表的结构或者数据被修改,如对该表使用了insert、 update、delete、truncate table、alter table、drop table或 drop database语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!

至于在mysql8中为什么会取消缓存?是因为维护缓存会造成部分开销,所以就取消了.

语法解析

如果缓存没有命中呢? 那么接下来才是真正的开始执行,当服务器接收到sql语句的时候,并不会立即执行,而是进行分析,包括了词法分析,语法分析,语义分析等. 词法分析会分析出这条sql语句的关键词,表名和列名等等.语法分析则会分析这条sql语句是否有错误,比如关键字select是否正确等,至于语义分析,我的感觉就是分析出这条语句是查询,修改还是删除等,这个下去再研究下.

语法解析就是上面的样子.

查询优化

mysql会对我们写的sql语句进行一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等,优化的结果就是生成一个执行计划,这个计划表名该sql语句会使用什么索引进行查询,执行的顺序是什么,这个很重要, 我们可以通过explain语句来查看某个语句的执行计划.

执行

上面那么多操作都还没有开始真正的查询数据,真正的查询数据就交给执行器来做把,在真正开始执行前会判断当前用户是否有操作的权限,有的话会根据操作表的结构去存储引擎操作,mysql服务器把数据的存储和提取操作都封装在存储引擎中,至于存储引擎中怎么存储,这个以后再详细了解.

不过要知道的是mysql的存储引擎有很多,最最常见的就是innodb和myisam了,我的印象中这两个的最大区别就是前者支持事务,后者不支持事务.至于存储方面我下午再研究一下. 不过重点应该放在innodb,这次就说一下执行流程,就到这.

本人也是学习者,如果有误还请指出,本人会进行修改.