当前位置: 首页 > news >正文

【MySQL进阶之路 | 高级篇】SQL执行过程

1. 客户端与服务器的连接

运行中的服务器程序与客户端程序本质上都是计算机的一个进程,所以客户端进程向服务器端进程发送请求并得到相应过程的本质就是两个进程间通信的过程.

我们可以使用TCP/IP网络通信协议,命名管道和共享内存等方式,实现进程客户端进程与服务器端进程之间通信.

2. 服务器处理客户端请求

(1). 前言

其实,无论客户端进程和服务器端进程采用哪种方式进行通信,最后实现的结果都是客户端进程向服务器端进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程返回一段文本(处理结果). 客户端可以向服务器发送增删查改等各类需求.

0802156c044243948290fd9479d11095.png

(2). server层

为了方便管理,人们把MySQL服务器处理请求的过程简单划分为server层与存储引擎层. 连接管理,查询缓存,语法解析等这些不涉及真实数据存储的功能划分为server层的功能.而把存储真实数据的功能划分为存储引擎层的功能.

1). 连接管理

  • 客户端进程可以采用上述的方式进行服务器端进程的连接. 每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程专门处理与这个客户端的交互.当客户端退出时会与服务器断开连接,此时服务器并不会立即把与该客户端交互的线程销毁,而是把它缓存起来,在另一个新的客户端需要再进行连接时,把这个缓存的线程分配给该新的客户端.这样就不用频繁创建销毁线程了,从而节省了开销.
  • 在客户端程序发送连接请求时,需要携带主机信息,用户名,密码等信息,服务器程序会对客户端程序提供的这些信息进行认证.如果认证失败,服务器程序则会拒绝连接.
  • 当建立连接后,与该客户端关联的服务器线程会一直等待客户端发送过来的请求.MySQL服务器接受到的请求只是一段文本信息,该文本还需要经过各种处理.

2). 查询缓存

  • MySQL服务器会将刚处理完的查询请求和结果缓存起来,如果下一次有相同的请求过来,则直接从缓存中查询结果,不用去底层的表中查找了.这个查询缓存可以在不同的客户端进程中共享.
  • MySQL服务器并没有那么灵活,如果两个查询请求有任何字符上的不同(即使意思一样),都会导致缓存不会被命中.另外,如果查询请求中包含某些系统函数,用户自定义变量,系统表,则该请求也不会被缓存.
  • 既然是缓存,就会有缓存失效的时候.MySQL的缓存系统会监测涉及的每张表,只要该表的结构或数据被修改,比如使用了insert,update等操作,则与该表有关的所有查询缓存都将变为无效并从查询缓存中删除.
  • 查询缓存会由于维护这块缓存而带来开销,以及缓存的命中率太低,MySQL8.0直接将查询缓存删除.

3). 语法解析

如果查询缓存没有命中,接下来进入到正式的查询阶段.因为客户端程序发送过来的只是一段文本,所以MySQL服务器程序首先对这段文本进行分析(包括词法解析,语法分析,语义分析等),判断请求的语法是否正确,然后从文本中将要查询的表,各种查询条件都提取出来放到MySQL服务器内部使用的一些数据结构上.

4). 查询优化

在语法解析之后,服务器程序获得了需要的信息,比如要查询的表和列是哪些,搜索条件是什么等. 但光有这些还不够,因为我们写的MySQL语句执行效率可能不高,MySQL的优化程序会对我们的语句做一些优化,如外连接转为内连接等等.优化的结果就是生成一个执行计划.这个计划表明了我们应该使用哪些索引来执行查询,以及表之间的连接顺序是啥样的等等.我们可以使用explain语句来查看某个语句的执行计划.

(3). 存储引擎

  • 到服务器程序完成了查询优化为止,还没有真正去访问真实表中的数据.MySQL服务器把数据的存储和提取操作都封装到了一个名为存储引擎的模块中.表是由一行一行数据组成的,这是一个逻辑上的概念.在物理上如果表示记录,怎么从表中读取数据等都是存储引擎负责的事.为了实现不同的功能,MySQL提供了各种各样的存储引擎,不同存储引擎管理的表可能有不同的存储结构,采用的存取算法也可能不同.
  • 存储引擎以前叫做表处理器,其功能就是接受上层传下来的指令,然后对表中的数据进行读取和写入操作.
  • 所以在server层完成了查询优化以后,只需按照生成的执行计划调用底层存储引擎提供的接口获取到数据后返回给客户端.需要注意的是,server层和存储引擎层交互时,一般以记录为单位.

 

 

相关文章:

  • 用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配
  • PCB行业迈入数字化新时代,智能工厂引领未来制造
  • 供应链投毒预警 | utilitytool系列Py包开展XenoRAT远控木马投毒
  • Android-Android Studio-FAQ
  • YOLOv8目标跟踪model.track的封装
  • Java学习 - 网络IP地址与子网划分 讲解
  • 【C/C++】我自己提出的数组探针的概念,快来围观吧
  • shardingsphere调优日记
  • 【源码】人力资源管理系统hrm功能剖析及源码
  • git 快速将当前目录添加仓储
  • 性能工具之 JMeter 常用组件介绍(五)
  • K-means聚类算法详解与实战
  • Spring中的ContextPath总结
  • Python应用开发——30天学习Streamlit Python包进行APP的构建(7)
  • Python实现逻辑回归与判别分析--西瓜数据集
  • 深入了解以太坊
  • ➹使用webpack配置多页面应用(MPA)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • iOS 颜色设置看我就够了
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Python 反序列化安全问题(二)
  • select2 取值 遍历 设置默认值
  • 编写高质量JavaScript代码之并发
  • 对JS继承的一点思考
  • 番外篇1:在Windows环境下安装JDK
  • 京东美团研发面经
  • 开源SQL-on-Hadoop系统一览
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 鱼骨图 - 如何绘制?
  • 正则与JS中的正则
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​卜东波研究员:高观点下的少儿计算思维
  • (39)STM32——FLASH闪存
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (zt)最盛行的警世狂言(爆笑)
  • (二)Optional
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (黑马点评)二、短信登录功能实现
  • (九十四)函数和二维数组
  • (四)鸿鹄云架构一服务注册中心
  • (一)Docker基本介绍
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)原始图像数据和PDF中的图像数据
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .CSS-hover 的解释
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net CHARTING图表控件下载地址