MySQL之SQL的查询语句如何执行

文章目录

  • 前言
  • 一、一条查询的SQL是如何执行的
  • 二、MySQL的“零件”们
    • 1.连接器
    • 2.查询缓存
    • 3.分析器
    • 4.优化器
    • 5.执行器
  • 总结


前言

做了多年技术之后,技术更新换代太快,从我入行时候从单体架构到后面分布式SOA,再到微服务,从后端再到全栈。期间涉及的技术一大堆,有的仍然在用,有的却已经沉没在历史的海洋里了。不过这么多年数据库常用的还是那几种,对于未来的AI时代,可能会有变革,但是数据依然是一切的基础,所以学好数据库还是很重要的。既然行业很卷,人心都很浮躁,那就专注的学学数据库吧,从了解数据库结构开始到应用再到优化,最后再利用对数据库的了解,学会数据分析,或许也不失为一条走向商业的路。 这一篇就来给大家聊聊MySQL的逻辑结构。


一、一条查询的SQL是如何执行的

大家经常见到这样的SQL:

SELECT * FROM Table WHERE ID = 11;

我们只是输入了一个SQL,看到的也只是返回的一个结果。却不知道他在MySQL内部运行的过程。
所以我们今天要把这个SQL拆解一下,看看MySQL到底为这条查询语句做了什么事情。这样当我们遇到MySQL异常或者问题时,就能直戳本质,更快的定位解决问题。

为此我画了一个MySQL的结构思维导图:
在这里插入图片描述
我们平时用的就是MySQL客户端,它可以分为Server层和存储引擎层两部分。

Server层包括连接器、查询缓存、优化器、执行器等。除此之外还涵盖了内置函数(日期、时间、数学和加密函数等),还有存储过程、触发器、视图都在这一层实现。

存储引擎则主要是负责数据的存储和提取。是插件式的架构,支持各InnoDB、MyISAM、Memory 等多个存储引擎。其中5.5.5版本之后InnoDB就成为了默认引擎。

前文所述的SQL是一条查询语句,自然而然的也会经过我们上述的各个“零件”。下面就给大家讲讲每个“零件”在查询过程中提供了什么服务。

二、MySQL的“零件”们

1.连接器

在Linux上或者Windows的cmd上操作过的朋友肯定熟悉这个命令:

mysql -h$ip -P$port -u$user -p

这个是连接MySQL数据库的命令,按照这个命令输入用户名密码。连接器就是负责跟客户端建立连接、获取权限、维持和管理连接。


2.查询缓存

建立完连接之后,就开始执行SELECT语句了。这时候就回来到查询缓存。
MySQL收到查询请求之后,会到查询缓存中找,看看是否执行过这个语句。之前执行过的语句会被当做key-value的键值对形式缓存在内存中。key是查询语句,value是返回的结果。如果在缓存中找到了这个key,就会直接返回value。熟悉java里map的小伙伴应该挺熟悉这个缓存原理。
如果缓存中没有这个key,就会继续后面的阶段。执行完成后会再把结果存入查询缓存中。

但是查询缓存的失效非常的频繁,只要有一个表更新,相关的所有查询缓存都会清空。
注:MySQL8.0版本后就没有这个功能了。

3.分析器

如果没有在查询缓存中找到对应的value。那么sql就会来到分析器中。MySQL需要先分析你这条SQL想要做什么,知道你的需求才能为你实现。
而分析器会先做“词法分析”,识别SQL里的字符串分别代表什么,把字符串“Table”识别为表名,把“ID”识别为列名是“ID”的那一列。
识别完了词法,接下来会识别“语法”。会根据你的SQL语句与MySQL的语法规则进行对比,如果不满足语法规则,就会得到下面的错误提醒。

“You have an error in your SQL syntax”

4.优化器

分析完了你想利用MySQL做什么,便会在执行你的需求之前进行前置的处理。
优化器会负责评估多种可能的执行计划,并选择最优的一种。它考虑多种因素,如索引的使用、数据的分布、连接操作的顺序等,以确定最有效的查询执行计划。

转换查询:当一个查询被转成另一种查询时,其结果是一样的,这被称为语句转化。例如,查询SELECT … WHERE 5 = a可以被转化成SELECT … WHERE a = 5。

使用索引:为了提高查询效率,是否正确使用了索引是一个关键因素。索引是数据库中用于加速数据*检索的数据结构。优化器会评估使用索引的利弊,并决定是否使用索引。

调整查询计划:优化器还会考虑多种因素,如数据的分布、查询的结构等,以确定最有效的查询执行计划。

5.执行器

当MySQL知道了你需要做什么之后,就会开始执行你的SQL语句。
开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误。
以最开始的SQL为例

SELECT * FROM Table WHERE ID = 11;

执行流程是这样的:
(1)调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 11,如果不是则跳过,如果是则将这行存在结果集中;
(2)调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
(3)执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。

总结

一条SQL查询语句的执行会经过一系列的流水线。连接器用来关联连接,权限验证。查询缓存提交查询效率。分析器做词法和语法分析。优化器执行计划生成、索引选择。执行器操作引擎返回结果。引擎层则存储数据,提供读写接口。其中每个环节都是比较重要的部分。

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

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

相关文章

Docker搭建MySQL8主从复制

之前文章我们了解了面试官:说一说Binlog是怎么实现的,这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本: 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

Java项目:基于SSM框架实现的教务管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm813基于SSM框架实现的教务管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

Docker进阶篇-DockerFile

一、简介 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚 本。 构建步骤: 1、编写Dockerfile文件 2、docker build命令构建镜像 3、docker run依镜像运行容器实例 二、Docker构建过程解析 1、Dockerfile…

2024美国大学生数学建模C题网球运动中的势头详解思路+具体代码

2024美国大学生数学建模C题网球运动中的势头详解思路具体代码 E题数据已更新,做E题的小伙伴推荐看看博主的E题解析文章。那么废话不多说我们继续来做C题。 赛题分析 我们先阅题: 在2023年温布尔登男单决赛中,20岁的西班牙新星卡洛斯阿尔卡…

数据结构—动态查找

动态查找介绍 1. 动态查找的引入:当查找表以线性表的形式组织时,若对查找表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。 2. 动态查找表的设计思想:表结构本身是…

【论文速览_01】Awesome Few Shot Segmentation论文

Awesome Few Shot Segmentation Awesome Few Shot Segmentation论文CVPR 2023Hierarchical Dense Correlation Distillation for Few-Shot Segmentation文章内容 MIANet: Aggregating Unbiased Instance and General Information for Few-Shot Semantic Segmentation文章内容 I…

探讨深浅拷贝在js加密中的运用

深浅拷贝是JavaScript中常用的概念,用于复制对象或数组。它们在处理数据时有不同的用途,适用于不同的场景。在本文中,我们将详细介绍深浅拷贝的概念,提供案例代码,并探讨它们在JavaScript中的应用场景,以及…

MySQL原理(一)架构组成之逻辑模块(1)组成

总的来说,MySQL可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query cache的处理等等&…

中二少年工具箱(PC端)简介

同学们可以私信我加入学习群! 正文开始 简介一、功能模块1.node版本管理工具 总结 简介 中二少年开发的中二少年工具箱,相信博主,功能不孬。 辅助自己开发工作,帮助新人快速入门,提供交互式文档辅助学习……如果还不…

拓展欧几里得法求逆元

板子: x即为最终答案,x可能为负数,加模数即可 乘法逆元 - OI Wiki (oi-wiki.org) void exgcd(int a, int b, int& x, int& y) {if (b 0) {x 1, y 0;return;}exgcd(b, a % b, y, x);y - a / b * x; } 使用: exgcd(a, n 1, x,…

空间计算时代加速到来,需要的不只是苹果

近年来,科技行业一直在期待“寒武纪”时刻。伴随技术革命的深入推进,所有厂商都预感新的时代即将到来,并期待自己成为那个引爆点,轻轻一触,推开一扇新的未来之门。 今年开年,苹果就为科技圈锚定了一个可能…

Hutool导入导出用法

整理了下Hutool导入导出的简单使用。 导入maven或jar包&#xff08;注意这里导入的poi只是为了优化样式&#xff09; <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId&g…

2024技术发展洞察与趋势学习总结

2023技术发展洞察 2024技术发展趋势

《Lua程序设计》-- 学习10

环境&#xff08;Environment&#xff09; 具有动态名称的全局变量 全局变量的声明 由于Lua语言将全局变量存放在一个普通的表中&#xff0c;所以可以通过元表来发现访问不存在全局变量的情况。 正如前面所提到的&#xff0c;我们不允许值为nil的全局变量&#xff0c;因为值为…

【Java程序设计】【C00196】基于(JavaWeb+SSM)的旅游管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的旅游管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游平台 本系统分为前台、管理员2个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID&#xff1f; 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

BetrFS: A Compleat File System for Commodity SSDs——论文阅读

EuroSys 2022 Paper 分布式元数据论文汇总 问题 在不同的工作负载下&#xff0c;没有单一的Linux文件系统在普通SSD上始终表现良好。我们将一个完备的文件系统定义为在各种微基准测试和应用程序中&#xff0c;没有一个工作负载的性能低于最佳文件系统性能的30%&#xff0c;并…

EasyX图形库学习(一)

目录 一、easyX图形库基本介绍 1、easyX的原理 2、easyX的安装 3、easyX的颜色&#xff08;RGB颜色模型&#xff09; 颜色模型相关函数: 4、easyX的坐标 二、相关函数介绍: 绘图设备相关函数&#xff1a; 图形颜色及样式设置相关函数: 图形绘制相关函数: 文字输出相关…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单&#xff0c;就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object&#xff0c;要么直接作为其他object的成员&#xff0c;因此我们不用担心它的生命期&#xff08;一个函数使用自己stack上…