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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 熟悉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)
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1天前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
18天前
|
关系型数据库 MySQL 数据库
mysql慢查询每日汇报与分析
通过启用慢查询日志、提取和分析慢查询日志,可以有效识别和优化数据库中的性能瓶颈。结合适当的自动化工具和优化措施,可以显著提高MySQL数据库的性能和稳定性。希望本文的详解和示例能够为数据库管理人员提供有价值的参考,帮助实现高效的数据库管理。
35 11
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
103 11
|
2月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
104 3
|
3月前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
289 4
|
3月前
|
安全 关系型数据库 MySQL
【赵渝强老师】MySQL的连接方式
本文介绍了MySQL数据库服务器启动后的三种连接方式:本地连接、远程连接和安全连接。详细步骤包括使用root用户登录、修改密码、创建新用户、授权及配置SSL等。并附有视频讲解,帮助读者更好地理解和操作。
448 1
|
4月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
376 6
|
3月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
873 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板