分析MySQL执行的流程(连接、缓存、分析、优化、执行、Undo Log、Binlog、Redo Log)

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 熟悉MySQL的都知道MySQL服务端实现主要分为Server层和存储引擎层。Server层负责接收和管理客户端连接、管理缓存、解析SQL、优化SQL、调用存储引擎执行SQL;存储引擎层主要负责存储、查询数据。

<br/><br/>

熟悉MySQL的都知道MySQL服务端实现主要分为Server层和存储引擎层。Server层负责接收和管理客户端连接、管理缓存、解析SQL、优化SQL、调用存储引擎执行SQL;存储引擎层主要负责存储、查询数据。
<br/>

一条查询SQL的执行过程

3c575a45b084415283b1e428ff6d1dc3.png

(图片来自于网络)

1、连接管理

连接器负责跟客户端建立连接、获取权限、维持和管理连接;

建立连接之后会验证用户名+密码,获取权限列表,连接完成;

连接建立后,无其他动作,则此连接将处于空闲状态;若连接后客户端长时间不发送命令到服务端,连接器会自动断开(由wait_timeout控制)

2、查询缓存

之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。

MySQL 收到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。如果当前查询语句能够直接在缓存中找到 key,那么这个 value 就会被直接返回给客户端;
如果不存在缓存,就继续执行直到完成后把结果存入缓存。(MySQL8.0后取消该功能 缓存极易失效)

3、分析SQL

分析器先会做【词法分析】。查询语句是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是 什么,代表什么,比如将 select 识别为查询语句,from 之后的字符串识别为表……

然后进行【语法分析】,判断是否符合MySQL的语法,根据SQL语法生成一个数据结构(解析树)。

4、优化SQL

经过分析器,MySQL 就知道具体要做什么操作。在开始执行之前,还要先经过优化器的处理决定选择使用哪一个方案。
比如在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接 顺序。

优化器最终会把解析树变成一个查询执行计划。

5、调用存储引擎

根据表的引擎定义,执行器选择具体的存储引擎,调引擎的接口执行查询
查询到的数据放入内存中,放入结果集里.
查询完毕后,将结果集返回给客户端

6、存储引擎

根据Server层生成的执行计划,查询并返回对应数据,不同的存储引擎执行查询的实现不一样。




一条更新SQL的执行流程

更新SQL执行流程,在Server层和查询SQL差不多,也会经过连接、查询缓存、分析、优化、执行的过程。只是查询缓存阶段,查询SQL是从缓存中查询是否存在和查询sql对应的缓存,而更新SQL是删除对应表的缓存;执行阶段,查询SQL是把磁盘或存储引擎缓存中的数据查询出来,而更新SQL是把新的数据更新到存储引擎缓存和磁盘中。

在这里插入图片描述

假设t_user表的存储引擎为InnoDB,一条更新SQL的执行过程如下:

【执行事务阶段】

1、客户端向MySQL发送执行 update t_user set name='小王' where id=1;的命令。

2、删除 t_user 表的所有缓存(如果开启了缓存的话)。

3-4、执行器调用InnoDB存储引擎查询接口,InnoDB在t_user表中查询id=1的记录,先从 Buffer Pool 中查询,如果存在直接返回,否则去磁盘中查询(如果id为主键,就会在聚簇索引上查询数据)。

5、在对查询到的记录修改前会先把旧值写入undo page(undo log的缓存)。

6、执行器查询到记录后,把name的值改为“小王”,调InnoDB的接口把新值写入Buffer Pool中的data page,这里注意下,MySQL执行增删改查,都是直接操作 Buffer Pool,查数据都是先从 Buffer Pool 中查,修改数据时页先写入 Buffer Pool。

7、把对Buffer Pool中data page和undo page的修改记录到 Log Buffer中(redo log的缓存)。至于Log Buffer中的内容何时持久化到磁盘,有不同的策略:

(1)根据刷盘策略执行(innodb_flush_log_at_trx_commit)

默认值为1,每次提交事务都会调用write()将log buffer中的数据写入 os buffer,并调用fsync()刷到磁盘;
值为0时,每次提交事务不操作,后台线程每秒调用write()将log buffer中的数据写入 os buffer,并调用fsync()刷到磁盘;
值为2时,每次提交事务都会调用write()将log buffer中的数据写入 os buffer,后台线程每秒调用fsync()将数据从os buffer刷到磁盘;

(2)Log Buffer空间不足时

(3)正常关闭服务器时

8、为了提升性能,事务执行过程中会把update操作记录到binlog cache,具体binlog cache的内容什么时候刷盘,也有不同的策略,根据sync_binlog来设置:

默认sync_binlog=0,表示每次提交事务都只调用write()把数据写入 os buffer,不调用fsync(),由文件系统去控制刷盘,性能最好。但如果此时宕机,会丢失未调用fsync() 的binlog日志;
sync_binlog=1的时候,表示每次提交事务都会调用fsync(),安全性最高,性能最差。
sync_binlog=N(N>1)的时候,表示每次提交事务都调用write(),但累积N个事务后才调用fsync()。

【提交事务阶段】

9、客户端向MySQL发送提交事务请求。

10、根据binlog刷盘策略把 binlog cache 刷盘到binlog文件。

11、调用InnoDB存储引擎提交事务接口,修改redo log 状态为commit,此时整个事务完成。

Buffer Pool中的脏页(修改但没有刷新到磁盘的新数据、undo log)由Master Thread 或 Purge Thread 负责根据一定策略刷新到磁盘中。



转载请注明出处——胡玉洋 [《根据一条Sql来分析MySQL执行的全流程(连接、分析、优化、执行、Undo Log、Binlog、Redo Log)》](https://blog.csdn.net/huyuyang6688/article/details/124059812)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
258 6
|
12月前
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
815 23
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
4886 32
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
589 9
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1171 55
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
1637 3
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
871 5
图解MySQL【日志】——Redo Log

热门文章

最新文章