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,这次就说一下执行流程,就到这.
本人也是学习者,如果有误还请指出,本人会进行修改.
Mysql服务器处理客户端请求流程的更多相关文章
- Ubuntu 14.04下MySQL服务器和客户端的安装
下面进行简单的配置 安装完成后通过修改/etc/mysql/my.cnf(此文件为mysql的配置文件).将文件中的binding-address=127.0.0.1注释掉.其它配置根据需要更改. H ...
- 后端向服务器发送客户端请求--HttpWebRequest
HttpWebRequest类与HttpRequest类的区别 HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息. HttpWebReques ...
- 2-Ubuntu命令安装mysql服务器和客户端及安装后的简单验证操作
转自: https://www.cnblogs.com/zhuyp1015/p/3561470.html 安装完成之后可以使用如下命令来检查是否安装成功: sudo netstat -tap | ...
- http的Content-Encoding和Content-Type及服务器和客户端处理流程
比如,A 给 B发送了一条信息:hello,首先,A要告诉B,我给你发的这条数据的类型,不同类型的数据,接收方的处理方式不一样,hello属于文本类型,所以Content-Type就要设置成 text ...
- 你的MySQL服务器开启SSL了吗?SSL在https和MySQL中的原理思考
最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...
- MySQL架构与SQL执行流程
MySQL架构设计 下面是一张MySQL的架构图: 上方各个组件的含义如下: Connectors 指的是不同语言中与SQL的交互 Management Serveices & Utiliti ...
- mysqladmin - 管理 MySQL 服务器、获取运行状态
官方文档 mysqladmin 是管理 MySQL 服务器的客户端,可以用来检测服务器的配置和当前状态.创建和删除数据库等. 1. mysqladmin 的调用语法 shell> mysqlad ...
- Node fs, url, http 组合小型的服务器 ( 满足html请求, get, post 传值 )
<script type="text/javascript"> /* * 引入模块 */ var http = require('http'); var url = r ...
- MySQL服务器是怎么处理客户端请求的
不论MySQL客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果).那服务器进 ...
随机推荐
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...
- Oracle_忘记密码
1.运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus/nolog 4.输入:connect/as sysdba 5.输入:altre user s ...
- 数组-在Shell脚本中的基本使用介绍
Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...
- 移动端触摸(touch)事件
移动端时代已经到来,作为前端开发的我们没有理由也不应该坐井观天,而是勇敢地跳出心里的那口井,去拥抱蔚蓝的天空.该来的总会来,我们要做的就是接受未知的挑战.正如你所看到的,这是一篇关于移动端触摸事件的文 ...
- ACM找bug方案
测试数据和一些常见的数据都通过了然而还是wrong,可以试试下面的一些解决方案: 1.数据爆掉 ① 可以改变数据类型,以容纳 ② 修改当前算法,比如a*a/b可以改写成a/b*a 2 特殊情况,例 ...
- dxteam团队项目终审报告
一. 团队成员的简介和个人博客地址 M1阶段 http://www.cnblogs.com/dxteam/p/3991514.html M2阶段 新成员 邓亚梅 http://www.cnblogs. ...
- SpringMVC-RESTRUL___CRUD知识点总结
RESTful风格 <!-- 携带surveyId去后台 --><!-- RESTFUL风格:/xxx/23 --><!-- 接收方式:@PathVariable注解 - ...
- ios开发之--CAKeyframeAnimation的详细用法
简单的创建一个带路径的动画效果,比较粗糙,不过事先原理都是一样的, 代码如下: 1,创建动画所需的view -(void)creatView { moveView = [UIView new]; mo ...
- .NET Framework 版本和依赖关系[微软官方文档]
.NET Framework 版本和依赖关系 微软官方文档: https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/ver ...
- session存入redis
Session信息入Redis Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一 ...