一条SQL执行的完整流程解析 - 《从0到1-全面深刻理解MySQL系列-第四篇》

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
全局流量管理 GTM,标准版 1个月
简介: 一条SQL执行的完整流程解析 - 《从0到1-全面深刻理解MySQL系列-第四篇》

image.png

文章大纲

一、前言

二、孽缘,一条SQL是如何被执行

2.1、连接处理模块:

2.2、解析和优化模块

2.2.1、查询缓存

2.2.2、语法解析

2.2.3、查询优化

3、存储引擎模块

4、延伸

三、MySQL流程常见面试题

3.1、数据库语句的执行顺序

四、系列文章

五、小结

image.png

一、前言

大家好,我是小诚,《从0到1-全面深刻理解MySQL系列》已经来到第四章,这一章节的主要从一条SQL执行的开始,由浅入深的解析SQL语句由客户端到服务器的完整执行流程,最终达到 “知其然、知其所以然” 的目的。


最近时常会收到一些小伙伴反馈的问题,为了方便交流,所以创建了交流群,感兴趣的可以添加,欢迎大家一起交流,吹水,摸鱼,进步。


《从0到1-全面深刻理解MySQL系列》系列文章会持续更新,感兴趣的小伙伴可以关注我,一起加油,一起进步!,如有帮助,不要忘记一键三联哦,ღ( ´・ᴗ・` )比心!

image.png

二、孽缘,一条SQL是如何被执行


 前几天在网上进行了一个面试,关于数据库方面的面试题其实也没少背,但是这个面试官的问题多少让我有些触不及防,他没有询问比较常见的基础语法和优化的问题,而是让我解释一条SQL从客户端到服务端的执行流程,这让我十分尴尬,因为平时只顾应用层面的东西,没有真正去理解到更深层次的东西,所以遇到非常规问题,很容易蒙圈,希望大家以我为鉴,学习一个知识要尽量达到"知其然、知其所以然",这样即使面试官变换问题的角度,我们也能更好的应对回答,叨唠完了,正片开始!



 平常工作中,我们最常见的就是从客户端发送一条SQL到数据库服务端进行相应的数据表操作,其实抽象起来就是: 客户端(也就是我们的业务代码)发送了一段SQL文本,服务端接收到了一段SQL文本然后进行解析处理,最终返回一段文本(执行结果)。



 那实际上服务端是对客户端进行了哪些解析步骤的操作才最终返回执行结果的呢?这里我们首先通过一张图片形象的展示解析的流程,然后再对逐个流程进行具体的解析。

image.png

2.1、连接处理模块:

 该模块主要是管理客户端的连接,客户端可以通过TCP/IP、命名管道、共享内存、套接字等方式与服务端进行连接,服务端接收到连接后,会专门生成一个线程去处理客户端的请求,当完成客户端的请求后,该线程不会被销毁,而是放入线程池中,从而减少了频繁创建和删除线程的消耗,大大节省了系统资源和提高了效率。


 客户端每次发起连接请求时,都会携带用户名、密码等验证信息,如果服务器验证不通过,则会拒绝连接,同时,如果很多客户端同时请求连接,为了避免服务端程序崩溃和提高效率,可以限制最大的连接数量。



2.2、解析和优化模块


 客户端和服务端建立完连接后,服务端会有专门的线程对客户端的请求做处理,此时服务端接收到的是客户端发送的一段文本信息,需要转换成自己可以识别的信息,具体步骤如下:



2.2.1、查询缓存


 试想,周末晚上你用手机看电影学习经验,突然老板给来了个电话,让你去处理一个紧急事情,你不得不中断看电影去处理突发事件,处理完后你肯定是想从上一次播放的位置继续观看而不是从头观看,缓存的作用就体现在这里。



 为了提高响应效率,Mysql服务端程序会根据客户端请求的信息生成对应的缓存,如果请求的信息符合缓存中的,则直接返回,无需再去与底层进行更多的交互。



 但是、Mysql服务器程序并不能像人一样智能,如果两次的请求文本不一样如多了空格、大小写以及每次调用会返回不同的值的函数等情况时,都不会命中缓存,因为它无法判断多出来的这些东西是否会影响SQL最终执行的结果。



 使用到了缓存,就涉及到对缓存维护,Mysql中的缓存检测程序会监测到缓存涉及的每一张表,如果表中的数据或者结构发生改变,如执行了insert、alter等命令时,那么它会将该表对应的缓存进行失效和删除。因为维护缓存是需要很大的开销,特别是表很多的情况下,所以Mysql8.0时已经将查询缓存这个流程删除。



2.2.2、语法解析


   如果请求没有命中缓存,则进入到语法解析的步骤,因为服务端程序接收到的是客户端发送过来的文本信息,Mysql服务端程序要从文本中将具体的请求含义解析出来,如查询什么字段,查询哪一些表等


2.2.3、查询优化


   经过语法解析步骤后,服务端程序已经知道客户端请求的信息,如请求的表,数据等,但是,此时服务器程序还不会立马根据这些信息去执行.它会解析出来的语句进行一些优化,如:子连接转为关联查询,内外连接查询等,以达到最大的优化效率,优化的结果就是生成一个执行计划,就是平常我们使用Explain关键字看到的一个结果。



3、存储引擎模块


 经过了连接处理和解析优化俩步骤后,实际上还是没有对实际的数据进行任何的处理,Mysql中,将对数据存储和提取的操作抽取到了一个叫存储引擎的模块中。



 在逻辑上,我们看到的是表的数据是一行行的形式,但实际物理层面上,表的数据如何存储、如何读取表的数据、这都是存储引擎需要负责的操作,Mysql中提供了不同的存储引擎,不同的存储引擎存储的数据结构可能不相同,采用的算法也可能不同。



4、延伸


 我们常在一些教学视频或者专业文章中看到MySQL Server层和存储引擎模块的概念,它们具体的含义如下:



 为了管理方便,将连接处理/管理、查询缓存、语法解析、查询优化等不涉及到真实数据存取的功能划分为Mysql Server层的功能。



 把涉及到真实数据存取的功能划分为存储引擎模块的功能,Mysql Server层通过各个存储引擎提供的API进行访问响应的存储引擎,Mysql通过查询优化生成了执行计划后,通过调用存储引擎提供的API获取到对应的数据返回给客户端即可。



三、MySQL流程常见面试题


3.1、数据库语句的执行顺序


 (一): 执行顺序



 from -> on -> join -> where -> group by -> having -> count(聚合函数) -> select -> distinct -> order by -> limit



 (二): 执行步骤解释:



 (1)、from: 表示数据的来源



 (2)、on: 表示数据的关联表,执行完后生成一个临时表t1,提供给下一步的操作使用



 (3)、join: 将join表的数据补充到on执行完成的临时表t1中,如: left join则将坐标剩余的数据添加到临时表t1中,如果join超过3个,则重复on…join之间的步骤。



 (4)、where: 根据携带的条件,从临时表中筛选出符合条件的数据,并生成临时表t2。



 (5)、groub by: 根据携带的条件,将临时表t2进行相应的数据分组,并形成临时表t3,如果语句包含了group by则它后面的字段必须出现在select中或者出现在聚合函数中,否则会报SQL语法错误。



 (6)、having: 筛选分组后临时表t3的数据,得到临时表t4。



 (7)、count等聚合函数: 对临时表进行指定字段的聚合函数操作,形成临时表t5。



 (8)、select: 从临时表筛选出需要返回的数据,形成临时表t6。



 (9)、distinct: 对临时表t6进行指定的去重筛选,形成临时表t7。



 (10)、order by: 对临时表t7排序,形成临时表t8。



 (11)、limit: 筛选返回的数据条数



 想要了解更多的执行过程的问题,可以查看之前专门解析执行过程的文章: 你真的懂使用Group by?



四、系列文章

 1、《从0到1-全面深刻理解MySQL系列》- 最详细的MySQL安装流程(Window版)



 2、《从0到1-全面深刻理解MySQL系列》- 最详细的MySQL安装流程(Linux环境)



 3、《从0到1-全面深刻理解MySQL系列》- 忘记MySQL登录密码时如何连接数据库



五、小结


 从上文我们可以知道,MySQL服务端又划分为: MySQL Server层和存储引擎层。MySQL Server层主要负责进行客户端连接、语法解析、语法优化等操作,存储引擎层负责对实际数据的存取操作。



 一条SQL语句完整的解析需要经历以下步骤: 客户端和服务端请求处理 -》查询缓存 -》语法解析 -》查询优化 -》存储引擎对数据存取 -》 返回处理结果



  下次遇到面试官询问这种问题,直接甩这篇文章在他脸上。最后、如果觉得文章对你有帮助,不要忘记一键三连哦,你的支持是我创作更加优质文章的动力,有任何问题可以私信我,看到会及时给你答复!


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
37 3
|
12天前
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
27 2
|
16天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
21天前
|
存储 SQL NoSQL
|
24天前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
78 3
|
24天前
|
缓存 关系型数据库 MySQL
MySQL执行计划深度解析:如何做出最优选择
【10月更文挑战第23天】 在数据库查询性能优化中,执行计划的选择至关重要。MySQL通过查询优化器来生成执行计划,但有时不同的执行计划会导致性能差异。理解如何选择合适的执行计划,以及为什么某些计划更优,对于数据库管理员和开发者来说是一项必备技能。
35 2
|
12天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
25 0
|
30天前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
73 0
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
68 0

推荐镜像

更多
下一篇
无影云桌面