MySQL innodb中一条sql的执行流程

1、一条SQL是如何执行的 一条SQL的执行流程。 阅读详情

在 MySQL InnoDB 存储引擎中,执行一条 SQL 语句的流程涉及多个模块的协作。下面是一个详细的讲解,包括 SQL 查询从接收、解析、优化、执行到结果返回的完整过程。


1. SQL 的执行流程概述

一条 SQL 的执行流程可以分为以下几个主要阶段:

  1. 客户端连接管理
  2. SQL 接收与解析
  3. 查询优化
  4. 执行计划生成
  5. 存储引擎层交互
  6. 返回结果

1. 客户端连接管理

  • 连接建立:
    • 客户端通过协议(如 TCP/IP 或本地套接字)连接到 MySQL 服务器。
    • MySQL 服务器通过连接管理模块分配线程来处理该客户端的请求。
  • 权限验证:
    • MySQL 检查用户身份和权限,确保该用户有权限执行该 SQL。
    • 如果验证失败,则直接返回错误。

2. SQL 接收与解析

  1. 接收 SQL:

    • 客户端发送 SQL 查询,MySQL 接收后将其传递到查询处理模块。
  2. 解析器(Parser):

    • SQL 文本被解析为 抽象语法树(AST)。
    • 检查 SQL 语法是否正确。如果语法错误,返回错误信息。
  3. 预处理(Preprocessor):

    • 校验语义,例如:
      • 检查表是否存在。
      • 检查字段名是否正确。
      • 验证用户对表和字段的权限。

3. 查询优化

MySQL 使用查询优化器生成高效的执行计划。

  1. 查询重写:

    • 将查询转化为更高效的等价形式,例如:
      • SELECT * FROM employees WHERE age > 25 可能改写为索引查询。
      • 子查询可能被优化为 JOIN。
  2. 生成候选执行计划:

    • 优化器根据查询语句的特性和表的结构生成多个候选执行计划。
  3. 选择最优计划:

    • MySQL 使用 成本模型(Cost Model) 评估每个执行计划的代价(如扫描行数、索引使用情况)。
    • 选择代价最低的执行计划。

工具提示:可以通过 EXPLAIN 查看优化器选择的执行计划。


4. 执行计划生成

优化器确定了执行计划后,会将其交给执行器。

  • 执行器是 MySQL 的核心模块之一,负责根据执行计划逐步执行 SQL。

5. 存储引擎层交互

InnoDB 作为 MySQL 的存储引擎,负责管理表数据的存储和读取。

5.1 执行器与存储引擎的协作
  • 读取数据:
    • 执行器根据执行计划向存储引擎发送请求,例如:
      • 使用主键或索引读取记录。
      • 全表扫描。
  • 过滤条件:
    • 如果查询条件未完全由索引覆盖,执行器会从存储引擎读取数据后再进行过滤。
5.2 InnoDB 内部的处理流程
  1. 索引管理:

    • InnoDB 使用 B+树 索引定位记录。
    • 如果是索引覆盖查询(索引中包含所有所需列),直接返回索引数据。
    • 如果需要完整记录(非索引列),通过主键回表获取。
  2. Buffer Pool 缓存:

    • InnoDB 首先在 Buffer Pool 中查找所需页(数据页或索引页)。
    • 如果找到(命中),直接从内存返回。
    • 如果未命中,从磁盘加载到 Buffer Pool 中。
  3. 事务管理:

    • InnoDB 根据事务隔离级别(如 RR、RC)处理多事务并发。
    • 通过 MVCC 或 锁机制 保证数据一致性。
  4. 日志记录:

    • Redo Log:记录数据更改,用于崩溃恢复。
    • Undo Log:记录数据的旧版本,用于事务回滚和 MVCC 实现。
5.3 返回结果:
  • InnoDB 将查询结果返回给执行器,执行器再交由 MySQL 服务层。

6. 返回结果

  1. 数据返回:

    • MySQL 将结果集封装成客户端协议格式。
    • 返回给客户端。
  2. 清理工作:

    • MySQL 清理执行过程中分配的临时资源(如内存、临时表)。

2. 流程示意图

以下是 SQL 流程的简化示意:


sql

复制代码

客户端发送 SQL ↓ 连接管理与权限校验 ↓ SQL 解析 ↓ 查询优化器 ↓ 执行器 ↓ 存储引擎(InnoDB) ↓ 事务控制(MVCC/锁) ↓ 数据存取(Buffer Pool/B+树) ↓ 日志管理(Redo/Undo) ↓ 执行器接收数据 ↓ 结果返回客户端


3. 示例:执行一条 SQL

假设有如下 SQL 查询:


sql

复制代码

SELECT name, department_name FROM employees e JOIN departments d ON e.department_id = d.id WHERE e.age > 30;

执行流程:

  1. 解析器:

    • 解析 SQL,验证 employees 和 departments 表是否存在。
    • 验证字段 name、department_name 是否有效。
    • 验证用户权限。
  2. 查询优化器:

    • 识别 JOIN,选择执行顺序。
    • 判断是否使用 employees.department_id 和 departments.id 索引。
    • 生成执行计划。
  3. 执行器:

    • 逐行扫描 employees 表,通过 department_id 查找 departments 表的 id。
    • 过滤 age > 30 条件。
  4. 存储引擎(InnoDB):

    • 使用索引(如 B+树)访问 employees 和 departments 数据。
    • 利用 Buffer Pool 提高访问速度。
    • 记录日志,处理事务。
  5. 返回结果:

    • 执行器整合结果,返回给客户端。

4. 总结

MySQL InnoDB 中 SQL 的执行流程核心在于 层次化的处理机制:

  • 服务层负责解析、优化、权限管理。
  • 存储引擎层负责数据存储、索引查找、事务控制等。

通过 EXPLAIN 分析执行计划,可以了解 SQL 在各阶段的执行细节,并针对性能问题进行优化。

手把手教你用STM32F103实现CAN总线双机通信(基于CubeMX+HAL库) 本文详细介绍了基于STM32F103和STM32CubeMX工具实现CAN总线双机通信的完整流程。文章重点解析了CAN总线在嵌入式物联网应用中的优势,并深入讲解了波特率计算、过滤器配置、接收中断处理等关键细节,提供了实用的代码框架和可靠传输方案,帮助开发者规避常见陷阱,构建稳定的工业级通信系统。 阅读详情

相关推荐

在Jetson orin NX上安装部署Yolov8

1、环境准备与依赖安装2、安装PyTorch和Torchvision:从NVIDIA官方论坛或开发者下载中心获取与你的JetPack版本兼容的PyTorch wheel文件。例如,对于JetPack 5.1.2,可以安装PyTorch v2.1.0 8。:需要编译安装与PyTorch版本匹配的Torchvision。这里自己编译没有成功,下载了一个现成的可以用torchvision-0.16.2+c6f3977-cp38-cp38-linux_aarch64.whl。

xxxcccvvvbbb的博客 776

Innodb是如何运转的

然而,对于Insert Buffer页的选择, InnoDB存储引擎并非采用这个方式,它随机地选择 Insert Buffer B+树的一个页,读取该页中的space及之后所需要数量的页。因为启用 Insert Buffer索引后,辅助索引页(space,page_no)中的记录可能被插入 到Insert Buffer B+树中,所以为了保证每次Merge Insert Buffer页必须成功,还需要有 一个特殊的页用来标记每个辅助索引页(space,page_no)的可用空间。

m0_53157173的博客 1199

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

InnoDB双写机制-redo log执行过程详解,以及宕机处理

服务器接受到请求后,先经过SQL接口,在经过解析器,在经过词法分析和语法分析后生成语法树,进入优化器,优化后得到执行方案,进入执行器,执行器调引擎层处理请求,以上过程比较简单请自行查阅其他资料。

Serinaldo的博客 1373

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 277

2015年全国大学生电子设计大赛综合测评题

2015年全国大学生电子设计大赛综合测评题 题目如下: 一、555产生可调方波 555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。 555定时器可组成单稳态电路、多稳态电路和无稳态电路。产生方波其实就是制造一个无稳态电路。 555定时器的引脚功能: 其中: DIS引脚与OUT脚电平一致 TRIG: 当此引脚电压降至1/3VCC(或由控制端决定的阈值电压)时输出端给出高电平。 THR:当此引脚电压升至2/3VCC(或由控制端决定的阈值电压

m0_47066484的博客 3万+

Mysql是怎样运行的之InnoDB介绍

InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢......

猿小许的博客 1144

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 436

mysql中INNODB索引的执行全过程详解

mysql中INNODB索引的执行全过程详解

向上的"狼"的博客 1968

2026年VIVO嵌入式岗位高频面试题(含参考答案)

摘要:VIVO嵌入式岗位考核涵盖智能手机、IoT设备、芯片适配等方向,重点考察硬件底层交互、RTOS/Linux开发、C/C++功底与问题排查能力。题目按优先级排序,分硬件架构、RTOS、C/C++、数据结构、Linux实践、行业认知6大模块,共40道题。硬件部分涉及中断、ARM架构、加速技术、BSP开发等;RTOS部分区分硬/软实时系统;C/C++部分侧重内存管理、位操作;Linux部分考察常用命令;行业部分关注鸿蒙等系统理念。题目设计贴合实际工作场景,全面评估嵌入式开发能力。

Open 52

Python爬虫实战:医院科室排班智能采集系统 - 从零构建合规且高效的医疗信息爬虫(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1298

mysql中innodb索引的执行流程

解释:因为满足name like '小%'的记录可能有多条,而age字段的有序是建立的name有序的基础之上,上图中(小红, 15) (小红, 16) (小金, 17) (小兰, 16),

qq_39635653的博客 482

AI Agent Harness实时监控大屏搭建实战

本文将以目前主流的AI Agent管控框架Harness为基础,结合React、ECharts、WebSocket技术,手把手带你搭建一套完整的实时监控大屏,覆盖全局概览、状态分布、工具调用统计、异常告警、实时日志等核心功能,不需要复杂的底层开发,复制代码就能快速跑通。本文我们从需求出发,先梳理了AI Agent的核心监控指标,然后搭建了监控大屏的静态布局,逐个实现了各个图表,对接了Harness的实时数据源,最后加了交互和告警功能,完整走了一遍监控大屏从设计到落地的全流程。

大数据洞察的博客 174

【MySQL架构】深度解析:一条SQL查询语句在InnoDB中的完整执行流程

某电商平台大促期间,数据库监控突然告警: 为什么强制使用索引反而变慢? 答案就在SQL执行的完整流程中! 1.2 创建性能分析专用配置 1.3 创建测试数据表 1.4 生成测试数据并开启监控 第二章:SQL执行全流程追踪 2.1 完整执行流程可视化 让我们通过一个复杂查询来追踪完整执行路径: 2.2 使用EXPLAIN ANALYZE进行实时追踪 2.3 性能模式深度分析 第三章:连接器与查询缓存 3.1 连接建立过程分析 3.2 查询缓存分析(MySQL 8.0之前) 第四章:分析器与解析过

持续输出Java相关知识 461

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MYSQL--一条SQL执行的流程,分析MYSQL的架构

MYSQL--一条SQL执行的流程,分析MYSQL的架构,借鉴小林coding文章

ngczx的博客 2046

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【MySQL | 第十一篇】一条SQL语句在MySQL的执行过程

一条SQL语句在MySQL的执行过程

踢桃的成长之路 1324

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL中一条更新的SQL如何执行

MySQL 之 -- 一条更新的 SQL 如何执行,一条更新的 SQL 语句如何执行执行流程一条 SQL 的执行流程如图所示:(图片来源于网络) 如图所示:MySQL 数据库主要分为两个层...

lxw1844912514的博客 624

运行mysql程序_mysql(一)--mysql架构和执行流程

InnoDB(2 个文件)https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.htmlThe default storage engine in MySQL 5.7. InnoDB is a transaction-safe (ACID compliant) storage engine for MySQL thathas c...

weixin_33561350的博客 219

【MySQL | 第11篇】一条SQL查询语句的执行全流程简析

这篇笔记详细解析了一条SQL查询语句在MySQL内部的完整执行流程。从宏观架构上,MySQL分为Server层和存储引擎层两大模块。具体执行过程包括:1)连接器建立TCP连接并验证权限;2)查询缓存检查(MySQL 8.0已移除该功能);3)解析器进行词法和语法分析;4)优化器基于成本评估选择最优执行计划;5)执行器调用存储引擎接口获取数据;6)存储引擎(如InnoDB)通过索引或全表扫描检索数据。整个过程揭示了MySQL处理查询的核心机制,为理解查询性能优化提供了理论基础,如索引选择、全表扫描代价等问题都

lyh2004_08的博客 1611

MySQL 一条 SQL 语句的完整执行过程详解

MySQL SQL语句执行过程详解:从客户端请求到结果返回,经历驱动连接、服务器线程处理、SQL解析、优化器生成执行计划、执行器调用存储引擎接口等阶段。InnoDB引擎通过Buffer Pool缓存数据,结合undo/redo日志实现事务特性,并与binlog协作确保数据一致性。关键优化点包括连接池配置、SQL编写规范、索引使用和事务控制。了解完整流程有助于编写高效SQL和性能调优。

weixin_39956506的博客 785

mysql一条语句执行更新判重_一条更新语句在MySQL是怎么执行的

本文试图从原理层面讲解一条更新语句在MySQL是怎么执行的。1update t set b = 200 where id = 2语句的执行过程如下:客户端(通常是你的服务)发出更新语句” update t set b = 200 where id = 2 “ 并向MySQL服务端建立连接;MySQL连接器负责和客户端建立连接,获取权限,维持和管理连接;MySQL拿到一个查询请求后,会先到查询缓存看...

weixin_31739613的博客 299

一条 SQL 更新语句是如何执行的?(超详细执行流程解析)

客户端↓连接器(鉴权)↓解析器(词法+语法分析)↓预处理器(表/字段/权限校验)↓优化器(选择索引/构建执行计划)↓执行器↓InnoDB 引擎:① 定位记录② 加锁③ 生成 undo log④ 写 redo log(prepare)⑤ 更新 buffer pool(脏页)↓写 binlog↓redo log commit(两阶段提交)↓事务提交成功↓最终落盘(后台)一句话总结✔ 读 SQL 看执行计划✔ 写 SQL 看日志与锁。

soft2001525的博客 1612

【基础篇】日志系统:一条SQL更新语句是如何执行的?

前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?首先,可以确定的说,查询语句的那一套流程,更新语句也是同样会走一遍。

shenyongsi的博客 1012

MySQL3:MySQL中一条更新SQL是如何执行的?

redo log的大小是固定的,所谓大小固定是指,它的结构是一个环状的,当新的内容写满了,会覆盖旧的内容,这个就是大小固定的意思。它可以通过参数来设置它的文件个数,可以通过来指定每个redo log文件的大小,默认是两个文件,你设置成4就是4个文件。所以在不断写的过程中,也需要不断地清理redo log的内容,如果一致不清理,那么当当前写的位置赶上了上一个清理的检查点的位置,那么就会触发buffer pool里面的内容刷盘。内存缓冲区对于提升读写性能有很大的作用。

郝开的博客 881

详细描述一下一条SQL语句在MySQL中的执行过程

详细描述一下一条SQL语句在MySQL中的执行过程

qq_30939943的博客 1433
上一篇: MySQL的主从复制
下一篇: Java内存区域详解
sevevty-seven
博客等级 码龄2年 757粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值