深度整理总结MySQL——SQL的执行顺序和流程

SQL的执行顺序和流程

    • SQL的执行顺序
    • 执行一条select语句,发生了什么呢
      • 连接器
      • 查询缓存
      • 解析SQL
      • 执行SQL
        • 预处理器
        • 优化器
        • 执行器
    • 总结

SQL的执行顺序

这是一条标准的查询语句:
在这里插入图片描述
但实际上并不是从上到下去解析的,真实的执行顺序是:

  1. 我们先执行from,join来确定表之间的连接关系,得到初步的数据
  2. where对数据进行普通的初步的筛选
  3. group by 分组
  4. 各组分别执行having中的普通筛选或者聚合函数筛选。
  5. 然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段
  6. 将查询结果去重distinct
  7. 最后合并各组的查询结果,按照order by的条件进行排序

在这里插入图片描述
那么为什么会是这样的顺序呢?
可能我们猛一下会认为先执行select,然后依次往下走,但仔细一想这实际上是不可能的.
因为一开始就select,数据源都不知道是什么?而且也没有处理过数据,如何select呢?
说白了我们写的是一个人类理解的格式,但是到计算机手里,它要去分解这个格式,我们探究运行原理,肯定要站在计算机的角度去看.
那SQL到底为什么要这样去处理呢?

  1. 首先要确认数据来源,(FROM/JOIN),因为不确定数据来源,后续操作就无法进行。
  2. 再筛选原始数据 (WHERE),减少数据量,提高效率。
  3. 然后分组 (GROUP BY),为聚合函数计算做准备。
  4. 对分组后的数据进行二次筛选 (HAVING),让聚合函数发挥作用.
  5. 确定最终返回的列 (SELECT),获取需要的字段或计算结果。
  6. 去重 (DISTINCT),确保数据唯一性。
  7. 排序 (ORDER BY),决定展示顺序。
  8. 限制返回的行数 (LIMIT),控制查询结果。
    这个顺序是 SQL 语法和数据库优化的结果,遵循这样的逻辑可以保证 SQL 查询能够高效执行,同时符合数据处理的逻辑顺序。

执行一条select语句,发生了什么呢

上面的话换句话问,MySQL执行流程是什么样子的
先来一张上帝视角图,解释了执行一条SQL查询语句.MySQL内部架构里的各个功能模块
在这里插入图片描述

MySQL 的架构共分为两层:Server 层和存储引擎层.

  • Server 层负责建立连接、分析和执行 SQL.
    大多数核心功能模块都在之类实现.
    主要是连接器,连接器,查询缓存、解析器、预处理器、优化器、执行器等.
    所有的内置函数和跨存储引擎的功能(存储过程,视图,触发器等)也在Server层实现.
  • 存储引擎层负责数据的存储和提取.
    支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层.

连接器

连接器负责MySQL的连接工作,因为MySQL是基于TCP实现的协议,所以首先需要经过TCP三次握手来启动MySQL服务,然后通过验证用户输入的用户名和密码,然后为此次连接的用于授予相应的权限.
查看MySQL服务被多少个客户端连接的命令:show processlist;
在MySQL中,空闲连接(建立好连接后不进行任何操作)是不能长期存在的,有wait_timeout参数控制,默认最大时长为8h.
MySQL中也存在长连接和短连接.长连接可以避免不必要的连接的资源消耗.但在长连接中,每次查询会使用内存连接管理对象,这些连接对象会在连接断开时释放,如果连接迟迟不断开,MySQL服务会占用过多内存资源.
解决方案
a. 定期关闭长连接
b. 客户端主动重连:MySQL5.7实现了mysql_reset_connection()接口,当连接中占用很多内存资源后,客户端会重置连接,将连接恢复到刚开始连接的状态(不需要重连和权限验证).
连接器做的工作:

1. 经过TCP三次握手启动MySQL服务
2. 验证用户输入的用户名和密码
3. 读取用户的权限并在连接中使用该权限

查询缓存

查询缓存中的记录是 以key-value的形式存储的,key是SQL语句,value是SQL语句对应的结果.
能够一定程度上提高查询的效率,但这种提升微乎其微.因为中缓存的记录会随着更新操作而清空.只要出现一个更新操作,查询缓存中的记录就会随之清空.因此在MySQL8.0中就将查询缓存删掉了,在MySQL8.0之前可以通过query_cache_type来手动关闭查询缓存

解析SQL

MySQL服务在收到SQL语句后会对SQL语句解析.而解析的工作通过解析器来执行.解析器会做2件事情

  1. 词法分析:将SQL语句中的关键字识别出来构建成SQL语法树.
    关键字| 非关键字| 关键字 |非关键字
    select |username |from |userinfo
  2. 语法分析:根据词法分析的结果语法规则判断SQL语句是否符合MySQL语法.
    在这里插入图片描述

如果语法不对,会在解析时将错误返回给客户端.注意:表不存在或字段不存在的错误无法再解析时被检测出来

执行SQL

执行SQL分为三个阶段

  1. prepare 阶段,也就是预处理阶段
  2. optimize 阶段,也就是优化阶段
  3. execute 阶段,也就是执行阶段
预处理器
  1. 检查 SQL 查询语句中的表或者字段是否存在.
  2. 将 select * 中的 * 符号,扩展为表上的所有列.
优化器

预处理阶段后,还需要为 SQL 查询语句先制定一个执行计划,这个工作是优化器完成的.
主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引.

执行器

真正执行语句是交给执行器去完成.
在执行的过程中,执行器就会和存储引擎交互了,交互是以记录为单位.

总结

最后回看这张图是不是很清晰了
在这里插入图片描述

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

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

相关文章

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…

Redis有哪些常用应用场景?

大家好,我是锋哥。今天分享关于【Redis有哪些常用应用场景?】面试题。希望对大家有帮助; Redis有哪些常用应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 是一个高性能的键值对存储数据库,它有许多应用场景&…

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…

SpringBoot开发(五)SpringBoot接收请求参数

1. SpringBoot接收请求参数 1.1. 获取参数的方式 &#xff08;1&#xff09;通过request对象获取参数   &#xff08;2&#xff09;RequestParam(针对请求头方式为x-www-form-ur lencoded)   &#xff08;3&#xff09;RequestBody(针对请求头方式为application/json)   …

如何理解多态,以及由此引出的抽象类和纯虚函数

文章目录 1. 多态2. 抽象类和纯虚函数 1. 多态 静态多态&#xff1a; 动态多态&#xff1a; #include <iostream> #include <string> using namespace std;// 动物的基类 class Animal { public:Animal(string name) : _name(name) {}virtual void bark() {} …

java基础2(黑马)

一、变量里的数据在计算机中的存储原理 1.二进制 .二进制&#xff1a;只有0、1&#xff0c; 按照逢二进一的方式表示数据。 十进制数字11转换为&#xff1a;1011 方法&#xff1a;除二取余法 计算机中表示数据的最小单元&#xff0c;一个字节&#xff08;Byte&#xff0c;简…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

数据结构与算法学习笔记----博弈论

# 数据结构与算法学习笔记----博弈论 author: 明月清了个风 first publish time: 2025.2.6 ps⭐️包含了博弈论中的两种问题Nim游戏和SG函数&#xff0c;一共四道例题&#xff0c;给出了具体公式的证明过程。 Acwing 891. Nim游戏 [原题链接](891. Nim游戏 - AcWing题库) 给…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

RFID隧道机:提升生产流水线效率与精准度

在当今制造业飞速发展的时代&#xff0c;生产流水线的效率与精准度成为企业竞争力的关键。传统的货物管理往往依赖于人工扫描和记录&#xff0c;效率低下且易出错&#xff0c;而RFID 隧道机的出现&#xff0c;为企业带来了智能化的管理体验&#xff0c;为生产流水线带来了从人工…

NSS-DAY2

Crypto [HNCTF 2022 Week1]A dictator 题目&#xff1a; from random import randint from secret import flagoffset randint(1,100) % 26 # print(offset)assert flag.startswith(NSSCTF{) assert all([ord(c) not in range(ord(A),ord(Z)) for c in flag[7:-1]])for cha…

systemctl配置httpd服务

一、环境介绍&#xff1a; Operating SystemopenEuler 22.03 (LTS-SP2)Kernel Linux 5.10.0-153.56.0.134.oe2203sp2.x86_64httpd versionhttpd-2.4.59ip address192.168.240.12/24 二、下载需要的软件包 yum install -y gcc gcc-c make apr apr-devel apr-util-devel pcre …

Redis bitmap应用

Redis bitmap应用 需求&#xff1a;存储用户今年已签到的天数&#xff0c;如在1月3日签到&#xff0c;则存 3 。。。以此类推 每秒300次请求压力测试 1、使用数据库存储 查询代码与时间 public List<Integer> selectSignRecord(long userId, Integer year) {if (year nu…

蓝桥杯之c++入门(六)【string(practice)】

目录 练习1&#xff1a;标题统计方法1&#xff1a;一次性读取整行字符&#xff0c;然后统计方法2&#xff1a;按照单词读取小提示&#xff1a; 练习2&#xff1a;石头剪子布练习3&#xff1a;密码翻译练习4&#xff1a;文字处理软件练习5&#xff1a;单词的长度练习6&#xff1…

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式

新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…

gc buffer busy acquire导致的重大数据库性能故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

[NKU]C++安装环境 VScode

bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂&#xff01;&#xff01;大学生及初学初学C/C进&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 ​ 2安装插件 2.1 C/C 2.2 C/C Compile run ​ 2.3 better C Syntax ​ 查看已…

DeepSeek-r1模型本地化部署最新教程

新的改变 DeepSeek 的搜索引擎基于深度学习算法&#xff0c;能够理解和分析大量的数据源&#xff08;如文本、图像、视频等&#xff09;&#xff0c;并结合用户的行为数据和偏好&#xff0c;提供个性化的搜索结果。 最近爆火的DeepSeek不用多说了&#xff0c;快来本地部署感受…

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…