当前位置: 首页 > article >正文

Mysql中select查询语句的执行过程

目录

1、介绍

1.1、组件介绍

1.2、Sql执行顺序

2、执行流程

2.1. 连接与认证

2.2. 查询缓存

2.3. 语法解析(Parser)

2.4、执行sql

1. 预处理(Preprocessor)

2. 查询优化器(Optimizer)

3. 执行器(Executor)

2.5. 存储引擎交互

2.6. 返回结果

3、示例流程(SELECT 查询)

4、常见问题与优化


前言

        MySQL 查询语句可以分为 Server 层存储引擎层。而 Server 层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,

        最后 Server 层再通过 API 接口形式调用对应的存储引擎层提供的接口来执行增删改查操作。

如下图所示:

更多mysql的介绍,可参考:聊聊对Mysql数据库的见解_如何更好的理解mysql-CSDN博客


1、介绍

关于sql语句在执行过程中,可能会涉及到以下的组件来进行相互的调用。

1.1、组件介绍

组件及其作用,可参考:

1.2、Sql执行顺序

        在 SQL 中,select 语句的语法结构看似是按照关键字书写顺序执行的(如 select ... from ... where ...),但 实际执行顺序 与语法顺序并不完全一致。

如下图所示:

⚠️注意:

        在包含子查询的 SQL 中,子查询本身也是一个完整的 select 语句,其内部仍然遵循上述执行顺序。外部查询的执行顺序会以子查询的最终结果为输入继续执行。

为了更好地理解这个顺序,我们可以从“数据流”的角度思考:

  1. FROM:首先确定从哪个表或视图中读取数据。
  2. WHERE:在获取原始数据后,先进行行级过滤,减少后续处理的数据量。
  3. GROUP BY:将过滤后的数据按指定字段分组,为聚合操作做准备。
  4. HAVING:在分组后,进一步过滤不满足条件的组。
  5. SELECT:确定最终返回的字段(包括常量、表达式、聚合函数等)。
  6. ORDER BY:对最终结果进行排序。
  7. LIMIT:限制返回的记录数量。

如下图所示:​​​​​​​


2、执行流程

        一个完整的执行流程包括以下组件,连接器、缓存、解析器、优化器、执行器存储引擎组成。

如下图所示:

2.1. 连接与认证

        MySQL 服务端和客户端的通信方式采用的是半双工协议。

客户端连接:客户端通过协议(如 TCP/IP、Socket)与 MySQL 服务端建立连接。

认证:服务端验证用户身份(用户名、密码、权限)。如果验证失败,连接终止。

权限检查:确认用户是否有权限执行当前查询(如 SELECT 权限)。

常见的通信方式主要可以分为三种:单工,半双工,全双工。

单工:

        通信的时候,数据只能单向传输。比如说遥控器,我们只能用遥控器来控制电视机,而不能用电视机来控制遥控器。

半双工:

        通信的时候,数据可以双向传输,但是同一时间只能有一台服务器在发送数据,当 A 给 B 发送数据的时候,那么 B 就不能给 A
发送数据,必须等到 A 发送结束之后,B 才能给 A 发送数据。比如说对讲机。

全双工:

        通信的时候,数据可以双向传输,并且可以同时传输。比如说我们打电话或者用通信软件进行语音和视频通话等。

        半双工协议让 MySQL 通信简单快速,但是也在一定程度上限制了 MySQL 的性能,因为一旦从一端开始发送数据,另一端必须要接收完全部数据才能做出响应。

        所以当批量插入的时候尽量拆分成多次插入而不要一次插入太大数据,同样的查询语句最好也带上 limit 限制条数,避免一次返回过多数据。

        MySQL 单次传输数据包的大小可以通过变量 max_allowed_packet 控制,默认大小为 64MB(5.7 版本默认只有 4MB)。

执行以下语句查看 max_allowed_packet 变量大小:

2.2. 查询缓存

缓存命中检查

        如果开启了查询缓存(Query Cache),MySQL 会直接检查是否有完全相同的查询结果缓存。

        命中:直接返回缓存结果。

        未命中:进入后续流程,并可能将结果写入缓存(取决于配置)。

        注意:MySQL 8.0 已移除查询缓存功能。

移除原因:

        因为 MySQL 的缓存使用条件非常苛刻,是通过一个大小写敏感的哈希值去匹配的,这样就是说一条查询语句哪怕只是有一个空格不一致,都会导致无法使用缓存。而且一旦表里面有一行数据变动了,那么关于这种表的所有缓存都会失效,所以一般我们都是不建议使用缓存。

        在 MySQL 8.0 版本之前缓存也是默认关闭的,可以通过变量 query_cache_type 进行控制。

2.3. 语法解析(Parser)

词法分析:将 SQL 语句拆分为 token(如关键字、标识符、操作符等)。

语法分析:根据 SQL 语法树规则,检查语句合法性(如 SELECT * FROM table 是否符合语法)。

生成抽象语法树(AST):将 SQL 转换为数据库可理解的内部结构。

        整个sql语句会被分割成:select,name,from,table,where,id,=,1这几个字符。并且能识别出关键字和非关键字,然后根据 sql 语句生成一个数据结构,也叫做解析树。

如下图所示:

2.4、执行sql

如下图所示:

1. 预处理(Preprocessor)

  • 语义检查
    • 检查表、列是否存在。
    • 验证权限(如用户是否有权限访问指定的表或列)。
    • 替换别名、处理函数等。
  • 生成逻辑查询计划:将 AST 转换为逻辑执行计划(如select a from t1 where b = 5)。

2. 查询优化器(Optimizer)

        其目标是生成最优的执行计划即最小资源消耗、最快响应时间)。

优化步骤

        选择访问路径:决定是否使用索引(如全表扫描 vs 索引扫描)。如果有多个索引,选择最合适的索引。

        连接顺序优化(针对多表查询):决定表的连接顺序(如 A JOIN B JOIN C 的顺序)。使用动态规划或代价模型(Cost Model)计算最优顺序。

        其他优化:优化子查询(如转换为 JOIN)。优化排序(ORDER BY)和分组(GROUP BY)。常量传播、条件简化等。

输出执行计划:生成物理执行计划(如使用哪个索引、连接算法等)。

3. 执行器(Executor)

  • 执行查询计划
    • 调用存储引擎接口(如 InnoDB、MyISAM)获取数据。
    • 根据执行计划逐层处理(如过滤、排序、分组)。
  • 权限二次检查:确保用户对访问的数据有权限。
  • 数据处理
    • 读取数据行(通过全表扫描或索引扫描)。
    • 应用 WHERE 条件过滤。
    • 对结果进行排序、分组、聚合等操作。

2.5. 存储引擎交互

  • 存储引擎接口:MySQL 通过统一的接口(Handler API)与存储引擎交互。
  • InnoDB 的处理
    • 通过 B+ 树索引定位数据。
    • 处理事务(如锁机制、MVCC)。
    • 返回符合条件的记录。
  • 其他引擎:如 MyISAM 的处理方式不同(无事务支持)。

2.6. 返回结果

  • 结果集组装:将处理后的数据按用户指定的格式(如 SELECT 字段)组装。
  • 分页处理:若涉及 LIMIT 或分页,截取对应的数据。
  • 返回客户端
    • 一次性返回(小结果集)。
    • 流式返回(大结果集,通过网络分批次传输)。

        MySQL 将查询结果返回是一个增量的逐步返回过程

        当处理完所有查询逻辑并开始执行查询并且生成第一条结果数据的时候,MySQL 就可以开始逐步的向客户端传输数据了。这么做的好处是服务端无需存储太多结果,从而减少内存消耗。


3、示例流程(SELECT 查询)

以 SELECT * FROM users WHERE id = 1; 为例:

  1. 客户端连接数据库。
  2. 检查查询缓存(未命中)。
  3. 解析 SQL 语法,生成 AST。
  4. 预处理:检查 users 表和 id 列是否存在。
  5. 优化器选择 id 索引进行查找。
  6. 执行器调用 InnoDB 引擎,通过索引定位到 id=1 的记录。
  7. 返回结果给客户端。

4、常见问题与优化

  • 慢查询:检查执行计划(使用 EXPLAIN),优化索引或调整查询逻辑。
  • 全表扫描:添加合适的索引或优化查询条件。
  • JOIN 性能:调整连接顺序或使用索引。
  • 缓存失效:频繁更新的表可能导致缓存命中率低(MySQL 8.0 后不再依赖此)。


参考文章:

1、聊聊对Mysql数据库的见解_如何更好的理解mysql-CSDN博客

2、一条 select 语句的执行过程_一个select语句执行过程-CSDN博客

相关文章:

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...