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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程中线程使用率偏高问题排查

1. top命令查看CPU使用率高的进程 2. top -H -p 15931(进程PID) 查看进程下的线程 3. printf "%x\n" 17503(线程PID) 线程PID 10进制转16进制 0x445f 4. jstack -l 15931(JVM进程PID) 导出java进程栈信息,里面包含线程nid0x445f和所在的类&#xff0…

路由器、路由器的构成、交换结构

目录 1 路由器 1.1 路由器的结构 “转发”和“路由选择”的区别 1.1.1 输入端口对线路上收到的分组的处理 1.1.2 输出端口将交换结构传送来的分组发送到线路 2.2 交换结构 2.2.1 通过存储器 2.2.2 通过总线 2.2.3 通过纵横交换结构 (crossbar switch fabric) 1 路由器…

Ai知识图谱

总结:从AI技术栈全貌来看,基础模型、基础算法,个人及小公司是玩不起的,大公司才有对应人力、财力、算力 去做,个人更多的是要在应用场景上创新,几个关键的技术必须会:编码语言(Pytho…

列式数据库、行式数据库简介

列式数据库、行式数据库简介 1、数据准备2、行式数据库3、列式数据库4、行式、列式存储对比 常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常…

WebSocket学习笔记以及用户与客服聊天案例简单实现(springboot+vue)

一:介绍: 二:http协议与websocket对比: 三:websocket协议: 四:实现: 4.1客户端: 4.2服务端: 五:案例: 环境:做一个书店…

Vim工具使用全攻略:从入门到精通

引言 在软件开发的世界里,Vim不仅仅是一个文本编辑器,它是一个让你的编程效率倍增的神器。然而,对于新手来说,Vim的学习曲线似乎有些陡峭。本文将手把手教你如何从Vim的新手逐渐变为高手,深入理解Vim的操作模式&#…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是:有一个自变量的情况称为单…

备战蓝桥杯---数据结构与STL应用(进阶2)

本文将主要围绕有关map的今典应用展开&#xff1a; 下面我用图进行分析&#xff1a; 下面为AC代码&#xff1a; #include<bits/stdc.h> using namespace std; struct Point {int x,y;bool operator < (const Point & r) const {return x < r.x || ( x r.x &a…

Day 1. 学习linux高级编程之Shell命令和IO

1.C语言基础 现阶段学习安排 2.IO编程 多任务编程&#xff08;进程、线程&#xff09; 网络编程 数据库编程 3.数据结构 linux软件编程 1.linux&#xff1a; 操作系统&#xff1a;linux其实是操作系统的内核 系统调用&#xff1a;linux内核的函数接口 操作流程&#xff…

计算机视觉-阅读内容和风格图像

首先&#xff0c;我们读取内容和风格图像。 从打印出的图像坐标轴可以看出&#xff0c;它们的尺寸并不一样。 %matplotlib inline import torch import torchvision from torch import nn from d2l import torch as d2ld2l.set_figsize() content_img d2l.Image.open(../img/…

Linux下编译EtherCAT主站SOEM-1.4.1

目录 1、SOEM下载 2、CMake安装​​​​​​ 3、编译 环境&#xff1a;Ubuntu1604. 1、SOEM下载 最新版为SOEM-v1.4.0&#xff0c;可以从github下载地址&#xff1a; https://github.com/OpenEtherCATsociety/SOEM 2、CMake安装​​​​​​ 3、编译 解压文件&#xff0c…

c++虚函数、静态绑定与动态绑定

首先说明&#xff0c;所谓绑定&#xff0c;就是指函数的调用 接下来&#xff0c;我们直接看一段代码来说明问题 class Base { public:Base(int data10):m_a(data){}void show(){cout<<"Base::show()"<<endl;}void show(int){cout<<"Base::sh…

[python]基于LSTR车道线实时检测onnx部署

【框架地址】 https://github.com/liuruijin17/LSTR 【LSTR算法介绍】 LSTR车道线检测算法是一种用于识别和定位车道线的计算机视觉算法。它基于图像处理和机器学习的技术&#xff0c;通过对道路图像进行分析和处理&#xff0c;提取出车道线的位置和方向等信息。 LSTR车道线…

docker镜像结构

# 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar"…

[SWPUCTF 2021 新生赛]babyrce

我们打开发现他让我们输入cookie值为admin1 出现一个目录 我们跳转进去 我们可以发现这个有个preg_match不能等于空格不让会跳转到nonono我们可以通过${IFS}跳过

桌面显示器应用Type-C接口有什么好处

随着科技的不断发展&#xff0c;桌面显示器作为我们日常工作中不可或缺的设备之一&#xff0c;也在不断更新换代。其中&#xff0c;Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么&#xff0c;桌面显示器应用Type-C接口究竟有什么好处呢&#xff1f; 首先&#xff…

一文教你地平线旭日派X3部署yolov5从训练-->转模型-->部署

一文教你地平线旭日派X3部署yolov5从训练&#xff0c;转模型&#xff0c;到部署 近日拿到了地平线的旭日派X3&#xff0c;官方说是支持等效5tops的AI算力&#xff0c;迫不及待的想在上面跑一个yolov5的模型&#xff0c;可谓是遇到了不少坑&#xff0c;好在皇天不负有心人&…

【Leetcode】1690. 石子游戏 VII

文章目录 题目思路代码结果 题目 题目链接 石子游戏中&#xff0c;爱丽丝和鲍勃轮流进行自己的回合&#xff0c;爱丽丝先开始 。 有 n 块石子排成一排。每个玩家的回合中&#xff0c;可以从行中 移除 最左边的石头或最右边的石头&#xff0c;并获得与该行中剩余石头值之 和 相…

H5 加密(MD5 Base64 sha1)

1. 说明 很多的时候是避免不了注册登录这一关的&#xff0c;但是一般的注册是没有任何的难度的&#xff0c;无非就是一些简单的获取用户输入的数据&#xff0c;然后进行简单的校验以后调用接口&#xff0c;将数据发送到后端&#xff0c;完成一个简单的注册的流程&#xff0c;那…

SVDiff: Compact Parameter Space for Diffusion Fine-Tuning——【论文笔记】

本文发表于ICCV 2023 论文地址&#xff1a;ICCV 2023 Open Access Repository (thecvf.com) 官方代码&#xff1a;mkshing/svdiff-pytorch: Implementation of "SVDiff: Compact Parameter Space for Diffusion Fine-Tuning" (github.com) 一、Introduction 最近几…