Mysql更新语句执行流程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Mysql更新语句执行流程

Mysql整理记录Day2

假设现在有一张表T,ID为主键和一个整型字段c,如果要将ID=2这一行的值加1,建表及更新语句如下:

create table T(ID int primarykey, c int);
update T set c=c+1 where ID=2;

与查询流程不同的是,更新还涉及到两个重要的日志:redo logbinlog

为什么会有两份日志呢?

因为最开始 Mysql 自带的引擎是 MyISAM,并没有 InnoDB 引擎,但是 MyISAM 没有 crash-safe 能力,binlog 属于server层的日志,用于归档(备份)。InnoDB是以插件的形式引入Mysql,并使用redo log实现crash-safe。

redo logbinlog区别:

  1. redo log是InnoDB引擎特有的;binlog 是 Mysql server 层实现的,所有的引擎都可以使用;
  2. redo log固定大小,循环写,空间会用完;binlog是可以追加写的,“追加写”指的是binlog文件写到一定大小会切换到另一个文件继续写,不会覆盖之前的记录;

补充:binlog 有两种格式:statement 和 row,statement 格式记录的是 sql 语句的原始逻辑,raw 格式记录的是更新前后的两条原始数据记录, 因此 row 格式的 binlog 体积大些。

试想一下,Mysql 如果每一次的更新都需要写进磁盘,磁盘需要找到对应的那条记录,然后更新,整个过程IO成本很高。

Mysql 是怎么做的呢?WAL(write ahead logging),也就是先写日志,再写磁盘。具体来说,需要更新一条记录的时候,InnoDB 引擎会先把记录写到 redo log,并更新内存,更新完成。引擎会在合适的时候将这个操作记录更新到磁盘。

有了上面对两个日志的了解,下面看看这条更新语句的执行流程:

  • 执行器先找引擎去ID=2这行数据。ID是主键,引擎直接通过树搜索找到这一行。此时有两种情况:如果这行记录的数据页刚好在内存中,则直接返回给执行器;否则需要先从磁盘找并读到内存,再返回。
  • 执行器拿到引擎给的数据,对c进行加1,调用引擎接口写入这行数据
  • 引擎将这行新数据更新到内存,同时记录到redo log,此时redo log处于prepare状态,然后告诉执行器执行完成,随时可以提交事务。
  • 执行器生成改操作的binlog,并把binlog写入到磁盘。
  • 执行器调用引擎的提交事务接口,引擎把刚写入的redolog改成commit状态

细心的同学可能注意到了,redolog的写入被拆成了两个步骤:preparecommit,这就是两阶段提交。

为什么需要两阶段提交呢?为了让两份日志之间的逻辑一致

redo log用于保证 crash-safe 能力。建议将 innodb_flush_log_at_trx_commit 这个参数设置为1,表示每次事务的 redo log 都写入到磁盘。

sync_binlog这个参数也设置为1,表示每次事务的binlog都持久化到磁盘,保证Mysql异常重启,binlog不丢失。

笔记参考于极客时间《MySQL实战45讲》


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化复杂查询,使用临时表简化数据库查询流程(13)
轻松入门MySQL:优化复杂查询,使用临时表简化数据库查询流程(13)
373 0
|
9月前
|
SQL 存储 缓存
MySQL执行流程
本文介绍了MySQL的执行流程,分为server层和引擎层。server层包含连接器、查询缓存、解析器、预处理器、优化器等组件,负责SQL的接收、解析、优化及执行;引擎层负责数据的存储与读取。文章详细解释了各组件的功能,如连接器负责用户身份认证,查询缓存提高查询效率,解析器进行SQL的词法和语法分析,预处理器验证表和字段的存在性,优化器选择最优执行计划,最终由查询执行引擎完成查询并将结果返回给客户端。
205 0
MySQL执行流程
|
6月前
|
SQL 算法 搜索推荐
mysql 之order by工作流程
本文深入解析了MySQL中`ORDER BY`的排序机制,通过具体示例展示了排序过程及性能优化方法。文章首先分析了基于内存和磁盘的排序方式,包括`sort_buffer_size`的影响以及临时文件的使用场景。接着介绍了`rowid`排序算法,该算法通过减少参与排序的数据量来提升性能,并对比了其与传统排序的区别。此外,还探讨了随机查询`ORDER BY RAND()`的执行流程及其优化策略。最后提到了MySQL 5.6引入的优先队列排序算法,适用于仅需部分有序结果的场景。文章结合`optimizer_trace`工具详细说明了各配置参数对排序行为的影响,为优化查询提供了实用指导。
mysql 之order by工作流程
|
10月前
|
存储 SQL NoSQL
|
12月前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
272 7
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
关系型数据库 MySQL 数据库
MySQL数据库——函数-字符串函数、数值函数、日期函数、流程函数
MySQL数据库——函数-字符串函数、数值函数、日期函数、流程函数
129 2
|
存储 SQL 关系型数据库
【MySQL进阶之路 | 基础篇】流程控制
【MySQL进阶之路 | 基础篇】流程控制
|
开发工具
centos8 yum安装mysql8 流程配置
centos8 yum安装mysql8 流程配置
996 0

推荐镜像

更多