MySQL深度剖析之SQL语句更新流程(2021)
#1 线程开始执行SQL更新请求之前,会创建事务,并且为当前线程分配一块内存空间叫做binlog cache
注意:binlog cache 是每一个线程分配一个;binlog cache大小受binlog_cache_size控制;如果binlog cache达到binlog_cache_size则将binlog cache内容移到一个临时文件中保存,但是这个文件不能超过max_binlog_cache_size,如果超过则报错;客户端断开连接,binlog cache释放
#2 SQL执行器从缓冲池Buffer Pool查找要更新的记录,并且对记录加锁。如果存在则进入第4步
#3 如果缓冲池不存在这条记录,则从磁盘加载到缓冲池,并且对记录加锁
#4 将更新前的值记录到undo log日志文件,方便回滚
#5 然后在内存更新记录
#6 将产生binlog event写入binlog cache
#7 因为修改后的记录,没有来得及刷入磁盘,有可能丢失数据,则将修改后记录写入到重做日志缓冲区(redo log buffer)
#8 提交事务的时候,redo log则会开启两阶段提交:首先是redo log buffer写入磁盘;写入binlog后;最后redo log commit完成redo log写入磁盘
#9 将binlog cache和临时文件里的内容写入binlog文件
#10 把本次更新binlog文件名以及位置写入redo log日志文件,然后写一个commit标记,标志事务最终完成
#11 MySQL 会在某个时候,将buffer pool中更新后的数据写入磁盘
注意:在提交的事务时候是否将redo log buffer写入文件或者操作系统页缓存由参数innodb_flush_log_at_trx_commit决定:
innodb_flush_log_at_trx_commit=0: 不会把redo log buffer数据写入磁盘
innodb_flush_log_at_trx_commit=1: 把redo log buffer数据写入磁盘,一般使用这个参数,不存在丢失数据,这种最安全
innodb_flush_log_at_trx_commit=2: 把redo log buffer数据先刷到操作系统页缓存(page cache),然后什么时候刷入磁盘由操作系统决定
另外,提交事务的时候将binlog写入文件还是操作系统由sync_binlog参数决定:
sync_binlog=0:会强制在提交事务的时候,把binlog写入操作系统页缓存,这种还是有可能丢失数据
sync_binlog=1:会强制在提交事务的时候,把binlog直接写入到磁盘文件里去
MySQL深度剖析之SQL语句更新流程(2021)相关推荐
- 详解MySQL的逻辑架构和SQL语句执行流程
文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...
- MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作
mysql 数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...
- 【大话Mysql面试】-常见SQL语句书写
[大话Mysql面试]-常见SQL语句书写 4.1 SQL语句主要分为哪几类? 数据定义语言DDL(Data Defination Language):主要为create drop alter等操作, ...
- 软件创新实验室:MySQL数据库与简单SQL语句使用
文章目录 前言 简介 特点 SQL DDL:操作数据库.表 DML:增删改表中数据 DQL:查询表中的记录 后记 拓展 范式 第一范式 1NF 第二范式 2NF 第三范式 3NF B+树 节点结构 插 ...
- MYSQL中常用的SQL语句(增删改查)
MYSQL中常用的SQL语句 一.增删改查 1.新增 指定字段插入: INSERT INTO <表名> (<字段1>, <字段2>, <字段3>) VA ...
- Oracle SQL语句执行流程与顺序原理详解
以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...
- 第二十三章 MySQL数据库 手册2 SQL语句
第二十三章 MySQL数据库 手册2 SQL语句 实验二:用SQL语句,管理数据库 `危险命令,delete 后不加 where 条件代表删除所有数据 delete.` `更加危险的删除命令trunc ...
- Mysql增删改查|SQL语句(史上最全|实战教学)
文章目录 关于数据库的操作 1.查看数据库 2.创建数据库 3.选择要操作的数据库 4.查看自己所处的位置及默认所在的位置 5.在命令行选择默认的数据库 6.删除数据库 关于表的操作 1. 查看库有哪 ...
- mysql 如何优化sql语句,如何优化SQL?MySQL中超实用的SQL语句送给大家
如何优化SQL?MySQL中超实用的SQL语句送给大家 如何优化SQL?MySQL中超实用的SQL语句送给大家 在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑.减少程序与数据 ...
最新文章
- http://forensics.idealtest.org CASIA图像篡改数据库
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
- 国家新一代人工智能开放创新平台将参加重庆智博会
- 在Java中实现过滤器和面包店锁
- leetcode面试题 17.15. 最长单词
- Django 博客教程(三):创建应用和编写数据库模型
- javafx做的天气预报小程序
- 暗影精灵3 黑苹果macOS BigSur 11.2.3 EFI
- 8.4 Power Management
- 只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手
- CIS芯片测试到底怎么测?
- 2023秋招--梦加网络--游戏客户端--一面面经
- Mysql 学习教程
- 第三届大湾区杯B题思路及代码-基于宏观经济周期的大类资产配置策略构建
- 王灏:光音网络致力打造Wi-Fi大生态圈
- 详解:海盗分赃(25 分)
- Matlab软件有哪些版本,matlab软件功能简要介绍及版本描述
- VB虚拟机中ubuntu Linux系统安装使用MCNP5
- [Excel] 用sumproduct函数实现数据透视表功能
- Anaconda中conda命令或者pip命令使用豆瓣镜像下载包
热门文章
- verilog实现汉明权重_(学习Verilog)6. FIR IP核的基础功能使用总结
- tp5 database.php,Tp5项目修改数据库
- c#实现http文件下载
- python soup findall_BeautifulSoup库findAll()、find()方法详解
- gm220s路由器怎么设置_巴法诺无线路由器连接打印机怎么设置【图文教程】
- php 上传excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例
- 分治法的关键特征_经典算法思想2——分治(Divide-and-Conquer)
- Feign 超时设置
- Java 算法 素数对猜想
- 9月11号华为发布鸿蒙2.0和EMUI 11,来看看鸿蒙最牛逼的地方