mysql update语句的执行流程是怎样的

update更新语句流程是怎么样的

  • update更新语句基本流程也会查询select流程一样,都会走一遍。
  • update涉及更新数据,会对行加dml写锁,这个DML读锁是互斥的。其他dml写锁需要等待。建议设置加锁的最长时间,由参数 innodb_lock_wait_timeout控制
  • mysql是高可用数据库(crash-safe),都是先写日志,再写数据,就是WAL技术(Write-Ahead Logging)。
  • 日志分类:redo log日志(重做日志),binlog日志(逻辑日志或归档日志),mysql事务是两阶段提交。2个日志写完事务才是真正的完成。
  • redo log日志是innodb引擎特有的,文件大小是固定的,可配置和个数和每个redo log日志文件大小。从头开始写,写到末尾就又回到开头循环写。
  • binlog日志是server层实现的,所以每个引擎都是支持的。
  • 保证mysql宕机数据不丢失,建议将参数设置为 双1innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘。 sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。
  • Redo log日志每次写入磁盘性能多低?所以mysql是用一部分内存来先写redo log日志,等时,等大小再批量一起写入到磁盘。这个内存的大小由 innodb_change_buffer_max_size参数控制。建议设置为innodb buff pool的50%。
  • update更新流程,语句: update T set c=c+1 where ID=2;

mysql update语句的执行流程是怎样的
  • 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  • 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  • 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  • 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

Original: https://www.cnblogs.com/penngke/p/15385614.html
Author: penngke
Title: mysql update语句的执行流程是怎样的

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586022/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL 批量修改库、表、列的排序规则

    1.表字段修复 SELECT TABLE_SCHEMA ‘数据库’, TABLE_NAME ‘表’, COLUMN_NAME ‘字段’, CHARACTER_SET_NAME ‘原…

    Linux 2023年6月7日
    0106
  • 挂载mount

    挂载mount 1.查看系统挂载的磁盘情况 df df -h 2.挂载:mount 将光驱挂在到/mnt目录: mount /dev/cdrom /mnt #mount 准备挂载的…

    Linux 2023年6月11日
    0116
  • linux与windows的批处理应用

    本文主要记录一下,不同服务器部署springboot项目时,用到的批处理命令 linux,针对maven-assembly-plugin打的tar.gz包的springboot项目…

    Linux 2023年6月14日
    0123
  • USB转RS232串口应用

    RS232串口是用于数据串行通信传输的标准之一,该标准定义了信号的电气特性和时序、信号的含义以及连接器的物理尺寸和引脚排列。RS232协议规范定义的是DB25接口,实际上大多数RS…

    Linux 2023年6月7日
    0138
  • Springboot集成Redis举例

    依赖包 配置文件(application.properties) 配置文件(RedisConfig.java) import com.fasterxml.jackson.annot…

    Linux 2023年5月28日
    0122
  • shell中 $() $(()) $[] ${} $[[]] 区别

    $( ) 与 (反引号) 在 bash shell &#x4E…

    Linux 2023年5月28日
    0113
  • 如何入行软件开发——常见问题及岗位分工

    —— 你以为我每天上班就是为了几个臭钱么!? —— 是的,你说对了…… IT是一个有些让业外同行羡慕嫉妒恨的行业,统计数据来说平均薪资应当是仅次于金融行业的…

    Linux 2023年6月13日
    0113
  • [apue] linux 文件访问权限那些事儿

    说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程。一个进程能不能访问一个文件,其实由三部分内容决定: 下面先简单说明一下这些基本概念,最后再说明它们是如何相…

    Linux 2023年6月6日
    0123
  • Linux安装nginx

    Linux安装nginx (1)安装c++编译环境装备yum install gcc gcc-c++ (2)安装PCRE库tar -zxvf pcre-8.38.tar.gzcd …

    Linux 2023年6月13日
    0102
  • bare Git 仓库是什么?

    背景 今天,坐我旁边的同事问我一些关于服务器上命令的问题。其中有一个用了特殊参数的 git init 的命令,我也不认识,遂去 Google… bare Git 仓库 …

    Linux 2023年6月7日
    0112
  • ssl证书的选型,你知道多少?

    介绍 目前互联网常用的HTTP协议是非常不安全的明文传输协议。而SSL协议及其继任者TLS协议,是一种实现网络通信加密的安全协议,可在客户端(浏览器)和服务器端(网站)之间建立一条…

    Linux 2023年6月6日
    099
  • 1s 创建100G文件,最快的方法是?

    在我们日常工作中,为了验证开发的功能,比如:文件上传功能或者算法的处理效率等,经常需要一些大文件进行测试,有时在四处找了一顿之后,发现竟然没有一个合适的,虽然 Linux 中也有一…

    Linux 2023年5月27日
    0104
  • SpringSecurity

    1、环境搭建 1、导包,使用maven搭建项目 2、关闭thymeleaf缓存 3、导入静态资源和相应页面代码 4、建立controller层 2、权限与认证 运用了 Aop 切面…

    Linux 2023年6月14日
    0113
  • 进程调度算法实现【先来先服务FCFS】【短进程优先SJF】

    #include #include #include #define MAX_DURANCE 1e6 using namespace std; /* * codeBy: slien…

    Linux 2023年6月8日
    0133
  • 从 Hadoop 到云原生, 大数据平台如何做存算分离

    Hadoop 的诞生改变了企业对数据的存储、处理和分析的过程,加速了大数据的发展,受到广泛的应用,给整个行业带来了变革意义的改变;随着云计算时代的到来, 存算分离的架构受到青睐,企…

    Linux 2023年6月14日
    085
  • powershell版,Fail2Ban脚本,阻止黑客攻击sshd

    关键字 powershell Deny Hosts Fail2Ban ssh linux 近期惊闻 黑客团伙利用SSH暴力破a解,入侵远程设备 用于挖矿和DDoS攻击 疑似来自罗马…

    Linux 2023年6月14日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球