Mysql(一)查询Sql是如何执行的

news2025/1/21 18:54:01

Hello,大家好我是极客涛😎,我最近在整理Mysql相关的知识点,所以准备开启一个Mysql的主线任务,大概耗时3周左右,整个节奏还是由浅入深,主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日志系统、锁、主从架构、无锁变更、最佳实践等等。大家可以随着我的这个路线,一起沉淀沉淀,如何检验自己的学习成果呢,刷面试题,遇到不清楚的在往深里研究。好了,那我们开始~

引言

我们知道Mysql是一个数据库系统,提供了对数据的增删改查API,我们通过一条条简单的SQL就可以实现对系统的各种操作,为了更容易理解,我们按照从整体到局部的思路,先鸟瞰Mysql整体的架构,然后再对每个细节深入研究,所以今天我们通过一条查询SQL的执行流程,看一看Mysql的应用架构是如何组成的。

本文结构
请添加图片描述

阅读体验

📚 全文字数 : 4k+
⏳ 阅读时长 : 6min

Mysql的应用架构

Mysql的应用架构遵循了职责单一、能力分层、插件化的原则。整体上看,Mysql主要分为服务层和引擎层:

服务层:Mysql的通用能力层,负责对外(客户端)暴露端口、解析SQL语法、执行SQL优化、通过调用引擎层的API对整个查询过程进行API调用的编排。

引擎层:引擎层负责对数据的存储和读取,并通过API将能力暴露给服务层使用。Mysql支持不同的存储引擎通过插件的方式接入Mysql的服务层,不同的存储引擎适用于不同的使用场景,如Memory、InnoDB、MySAM。

再进行细分的话,服务层又包括:连接器、查询缓存、分析器、优化器、执行器。
请添加图片描述

连接器

不管Mysql内部如何运行,都需要有一个与外界进行交互的桥梁,连接器就起到了桥梁的作用。连接器是Mysql的统一门面,负责与客户端建立会话连接、进行用户认证、查询用户权限、维持和管理会话连接。

mysql -h$ip -P$oprt -u$username -p$password

当我们执行mysql的连接命令时,通过ip + port 定位到是哪个Mysql服务,经过TCP握手之后,连接器和客户端就建立了会话连接,然后这条命令就来了连接器。连接器首先通过 -u-p 参数对本次请求进行认证操作,验证用户是否在Mysql服务中注册过,密码是否正确,如果认证失败,则直接响应Access denied for user ‘xxx’@‘localhost’ (using password: YES)

认证通过后,连接器则会查询用户的权限列表,判断对该用户是否开放了远程连接权限。Mysql默认只允许本机(localhost)进行连接操作,如果没有远程连接权限直接响应Access denied for user ‘root’@‘%’ to database ‘mysql。如果有远程连接权限,那么本次连接就真正意义上建立完成了。需要注意的是,查询出来的权限列表会一直向下传递,之后对表的权限校验、对操作的权限校验都依赖于这个权限列表。

正是因为先鉴权再建立会话连接,所以即使对当前连接用户的权限进行了修改,也不会立即生效,需要等到下次重新连接时才会生效。

为了提高资源的利用率,当客户端与连接器建立连接之后,如果客户端长时间没有进行任何操作,连接器会自动将这个连接断开(默认是8小时,由wait_timeout参数控制)。

在客户端与服务端的通信中,一般分为长连接短连接长连接就是客户端和服务端建立连接之后会一直保持的这个连接,后续的任意操作不会重建连接,这样避免了每次操作需要重新创建连接的操作,执行速度会快很多。但是连接不释放就意味着对象不能销毁,如果连接数过多的话,可能会导致Mysql服务因内存不足而重启;短连接相反,每次请求都需要重新创建连接,相对来说执行速度会慢一些,但是每次请求完都释放连接和对象,这样消耗的内存资源要大大降低。

从客户端的角度来说,肯定更中意使用长连接,因为可以提高响应速度;从服务端的角度来说,更中意短连接,因为逻辑简单,资源消耗少。那如何中和两个方案的优缺点呢?连接池就顺势而生了,连接池是存在于客户端的,应用程序会在初始化时通过连接池申请若干个长连接,而应用程序内的所有线程共享这个连接池,因为一次请求很快就结束了,这样其它请求来的时候可以复用这个连接,而当某个连接长时间没有被使用时,就将其释放,这样便发挥了长连接和短连接各自的优点。

查询缓存

select * from geektao where id = 2;

通过连接器的认证鉴权之后,就开始进行查询操作了。

首先会看看当前SQL是否已经在查询缓存中存在,查询缓存通过key=value的方式存储SQL及其执行结果,如果存在则直接返回缓存中的执行结果,查询效率大大提高。

但是在实际的生产使用过程中并不建议使用查询缓存,因为生产中被查询的数据往往是不断变化的,这样就会造成缓存一直失效,每次查询完之后还要设置缓存,不仅没有提高查询效率,反而造成额外的开销,使用起来很鸡肋。Mysql8.0版本直接把查询缓存整个模块删掉了,如果版本小于8.0的话可以通过设置query_cache_type=DEMAND关闭查询缓存。

分析器

如果查询缓存关闭或者缓存中没有的话,那么就真真正正的开始解析SQL了。了解编译原理的同学应该知道,作为一个解析器不可缺少的三个功能:词法分析语法分析语义分析

词法分析

词法分析是SQL解析的第一步,它负责将输入的SQL语句字符串分解成一系列的Token(词元)。这些Token是SQL语法的基本组成单元,例如关键字(如SELECTFROM等)、标识符(如表名、列名)、常量值等。但是此时分析器还不知道什么意思,就像我们小时候学字一样,只知道王是王,李是李,并不理解。

语法分析

语法分析阶段,MySQL根据SQL语言的语法规则,将词法分析阶段产生的Token序列转换成一个抽象语法树(Abstract Syntax Tree,AST)。这个过程中,会检查SQL语句是否符合MySQL的语法规则。这时候就像小时候已经开始学造句了,根据特定的语法造句,但是也没有真正理解造出来句子的含义。

语义分析

在语法分析之后,接下来就是语义分析阶段。在这个阶段,MySQL的解析器会检查抽象语法树是否有意义,即检查SQL语句在逻辑上是否正确。这包括识别列名、检查数据类型、确定操作符函数的正确使用、处理别名表达式等。如果在这个阶段发现错误,比如找不到表或列、类型不匹配等,解析器会生成错误信息,此时Mysql才真正理解了这条SQL到底想干啥了。

优化器

经过分析器之后,Mysql就知道我们想干什么了,那下一步是不是就直接去干了。Mysql可没有你想的这么简单,在去干前,Mysql会”思考“如何使用最的查询步骤来查询。

优化器会根据抽象语法树生成执行计划,如果表中有多个索引的话会确定去哪个索引里查询,如果是多表关联查询的话会确定先去哪个表查询再去哪个表查询。总之,优化器会根据不同的情况制定出一个最优的方案,这样Mysql才知道怎么做。

执行器

对执行器来说”器如其名“,前边我们已经通过分析器知道了要做什么通过优化器知道了怎么做而执行器通过执行计划一步步的执行

在执行之前,执行器首先会判断当前用户是否对表有相关的操作权限,而判断的依据就是连接器当时查询出来的权限列表。有同学可能有疑问,到执行器在进行表的权限校验是不是有些晚了,在分析器阶段不是已经知道是要操作哪张表了吗?

确实,在优化器之前会调用precheck验证权限,但是这时候只是进行简单的权限校验,查询的表存不存在、列存不存在,对查询的表有没有操作权限,这些校验都是静态校验。在真正执行时也需要动态校验,因为执行时是运行态,比如该表有个触发器,只能在执行阶段才能进行校验(有一点点像class文件加载过程中的验证阶段)。

执行器阶段的权限校验通过之后,就开始调用执行引擎的接口进行数据读取操作了。

假设不走索引的情况

  1. 打开要查询的表;

  2. 调用执行引擎接口获取第一行记录,判断id是否等于2,等于则保存结果到结果集中;

  3. 调用执行引擎接口获取下一行记录,判断id是否等于2,等于则保存结果到结果集中;

  4. …;

  5. 没有下一行数据,调用结束;

  6. 执行器将结果集返回给客户端。

至此,一条查询语句便执行完毕。

小结

今天主要讲解了Mysql的应用架构,并通过查询SQL为例,对Mysql的每个组件及其作用都进行了描述,相信大家对Mysql整个运行流程有了一个大概的了解,下边给大家留了一些问题加深大家的印象😄。

问题

  1. Mysql的基本架构包括什么,每部分有哪些作用?
  2. select * from geektao where name = 'xx';当表中没有name字段时会怎么样?这是在哪一步判断的?
  3. 为什么要使用连接池?工作原理是什么?一般如何进行参数调优?
  4. 如果Mysql服务端因升配导致连接失效,客户端该如何自动重连?
  5. Mysql哪些阶段会进行权限校验,目的是什么?
  6. select sum(amount) from geektao;sum()是在哪一步计算的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C][数据结构][时间空间复杂度]详细讲解

目录 0.铺垫1.时间复杂度 -- 衡量算法的运行快慢1.是什么?2.大O的渐进表示法 2.空间复杂度 - 衡量算法所需要的额外空间3.常见复杂度对比 0.铺垫 时间是累计的空间是不累计的,可以重复利用 1.时间复杂度 – 衡量算法的运行快慢 1.是什么? …

SQL Server数据库UNC路径注入攻击

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 UNC路径注入 如果我们能强制SQL服务器连接到我们控制的SMB共享,连接将会包含认证数据。更具体的来说,将会发起一个NTLM认证,我们将能…

词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码

实验原理: 词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符、关键字(保留字&a…

【实物+仿真设计】智能安全门控制系统设计

《智能安全门控制系统设计 实物仿真》 整体功能: 本课题首先确定整个智能安全门控制系统进行总体方案设计。主要包括按键模块、 电磁锁模块、语音提示模块、人员检测模块。按键提供给用户人工交互的功能,用户可 以选择输入按键的方式控制安全门。单片机…

民国漫画杂志《时代漫画》第39期.PDF

时代漫画39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

市场凌乱,智能算法哪种效果好?

当我们在面对市场波动,个股震荡,无从下手的时候,不懂算法的朋友就只懂做t;懂算法的朋友这会儿就迷茫并不知道选择哪种智能算法交易?今天小编给大家整理一套性价比高的,适合个人投资者搞的算法交易&#xff…

【SITS_CC】卫星图像时间序列的变化字幕(IEEE GRSL)

摘要 Satellite images time series (SITS) 提供了一种有效的方法来同时获取地球上观测区域的时间和空间信息。然而,传统的遥感CD方法的输出是二进制图或语义变化图,往往难以被最终用户解释,传统的遥感图像变化字幕方法只能描述双时图像。提…

湖南(品牌定位)源点咨询 企业如何选择品牌定位差异化调研

湖南源点认为:精准且占据消费者认知,探寻与消费者共鸣的常态化品牌定位调研是企业品牌长远健康发展的基石。 品牌定位里要强调品牌的差异。英文是point of difference. 这个差异点就是强调品牌能带来的利益(benefit)。 这个“利…

C++编程:模板初阶

目录 一、泛型编程 1、通用版交换函数的实现: 2、模板的引入 二、函数模板 1、函数模板的定义和使用 2、函数模板的实例化 三、类模板 1、类模板的定义和实例化 模板是C的一项强大特性,犹如中国古代四大发明中的活字印刷术与造纸术融为一体一般&a…

【学习】测试用例设计与执行的黄金法则

在软件测试领域,测试用例的设计与执行是确保产品质量的关键环节。一个优秀的测试用例能够揭示软件中的缺陷,而高效的执行则能保障测试覆盖的全面性。如同璀璨的星辰指引航船前行,以下黄金法则将引领测试用例设计与执行的过程,确保…

uniapp内置的button组件的问题

问题描述 由于想要使用uniapp内置button组件的开放能力,所以就直接使用了button,但是他本身带着边框,而且使用 border:none;是没有效果的。 问题图片 解决方案 button::after {border: none;} 正确样式 此时的分享…

2024 年该如何利用 MidJourney 创作AI艺术(详细教程)

什么是 Midjourney Midjourney 是根据文本提示创建图像的生成式人工智能的优秀范例。与 Dall-E 和 Stable Diffusion 一样,它已成为最受欢迎的人工智能艺术创作工具之一。与竞争对手不同的是,Midjourney 是自筹资金和封闭源代码的,因此对它的…

Java并发核心问题以及并发三特性原子性、可见性、有序性

这篇文章比较长,请耐心看完,相信会让你对并发三大特性有一个较深的理解。 1.原子性(Atomicity) 1.1 原子性定义以及理解 即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的…

C/C++学习笔记 C读取文本文件

1、简述 要读取文本文件,需要按照以下步骤操作: 首先,使用该函数打开文本文件fopen()。其次,使用fgets()或fgetc()函数从文件中读取文本。第三,使用函数关闭文件fclose()。 2、每次从文件中读取一个字符 要从文本文…

康谋技术 | 自动驾驶:揭秘高精度时间同步技术(一)

众所周知,在自动驾驶中,主要涵盖感知、规划、控制三个关键的技术层面。在感知层面,单一传感器采集外界信息,各有优劣,比如摄像头采集信息分辨率高,但是受外界条件影响较大,一般缺少深度信息&…

谢宁DOE培训的奇妙之旅:从陌生到熟练

在充满挑战与机遇的现代社会,不断提升自我,掌握新的技能和知识,成为了我们追求进步的重要途径。而对于我来说,参加谢宁DOE培训,无疑是我职业生涯中的一次重要抉择。这次培训让我从对谢宁DOE陌生到熟练,经历…

csrf漏洞与ssrf漏洞

环境:用kali搭建的pikachu靶场 一.CSRF 1.CSRF漏洞简介 跨站请求伪造(CSRF)漏洞是一种Web应用程序安全漏洞,攻击者通过伪装成受信任用户的请求来执行未经授权的操作。这可能导致用户在不知情的情况下执行某些敏感操作&#xff0…

【python深度学习】——torch.einsum|torch.bmm

【python深度学习】——torch.einsum|torch.bmm 1. 基本用法与示例2. torch.bmm 1. 基本用法与示例 基本用法: torch.einsum(equation, *operands)equation: 一个字符串,定义了张量操作的模式。 使用逗号来分隔输入张量的索引,然后是一个箭头&#xff…

38. 【Java教程】日期和时间处理

本小节我们将学习 Java 中的日期和时间,日期和时间在我们的实际开发中非常常用,例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习,你将了解到什么是日期、什么是时间、什么是时区,Ja…

ru域名如何申请ssl证书

SSL证书是一种数字证书,通过它可以在客户端和服务器之间建立加密通道,保证数据在传输过程中的安全性。对于.ru域名来说,申请SSL证书可以有效提升网站的安全性,增强用户对网站的信任度,提高网站的排名和权重。今天就随S…