当前位置: 移动技术网 > IT编程>数据库>Mysql > MYSQL学习笔记--SQL更新语句的执行

MYSQL学习笔记--SQL更新语句的执行

2020年07月30日  | 移动技术网IT编程  | 我要评论

MYSQL更新语句是这样子的:

mysql> update T set c=c+1 where ID=2;

更新语句跟查询语句走的流程是一样的:
在这里插入图片描述
跟查询一样,连接器----》查询缓存—》分析器----》优化器—》执行器。
与查询不同的地方,多了两个日志模块redolog和binlog.
redo log
由于每次操作如果每次对数据库的操作都写入磁盘进行持久化的,整个操作的IO成本,查找成本都很高。所以MYSQL设计者就用了WAL技术(Write-Ahead Logging).原理就是先写日志,在不忙的时候在写磁盘,提高效率。
INNODDB先把记录写入日志,更新内存,然后直接返回。redo log的大小是固定的,比如可以配置一组4个,每个1GB,总共用4G的缓存空间。同时redo log采用了循环缓冲区的数据结构,如下图:
在这里插入图片描述
当write_pos 等于check point的时候,表示缓冲区已经满了,需要先清理一下缓冲区。
有了这个设计,就可以保证crach-safe,当数据库异常重启的时候,之前提交的事物记录都不会丢失。
binlog
binlog(归档日志),是MYSQL SERVER层,不具备crach-safe能力。redo log是innodb拥有的。
不同的地方:
1 redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2 redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3 redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

更新语句执行流程:
1 执行器找引擎拿到ID=2这一行,如果在内存,直接从内存里面取。如果不在内存,则从磁盘里面拿。
2 拿到数据后进行+1操作,调用引擎接口写入。
3 引擎写入内存,同时写入redo log,并把状态改为prepare,告知执行器执行完成,可以随时进行提交事物
4 执行器生成binlog,并持久化到磁盘
5 执行器开始提交事务,引擎把redo log的状态从perpare改为commited
两阶段提交
其实就算让两个不同的文件保存逻辑上的一致
顺序不能变,假设:
1 先写 redo log 后写 binlog。
redo log 写完,但是没有写binlog,发生了崩溃。redo log已经写完,binlog没有写。使用binlog备份的时候就会少记录,那么用这个binlog去恢复的时候就会造成丢失数据。
2 先写 binlog 后写 redo log
binlog写完,redolog没有写入就崩溃了。那么这个事物是无效的,因为redolog没有这一条记录,但是binlog却有这条记录,从binlog恢复的时候就会多出一条事物,造成了数据的不一致。

本文地址:https://blog.csdn.net/yangzhengqui/article/details/107660628

如对本文有疑问, 点击进行留言回复!!

相关文章:

  • MySQL InnoDB表空间加密示例详解

    前言从 mysql5.7.11开始,mysql对innodb支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数... [阅读全文]
  • 如何解决mysql无法关闭的问题

    如何解决mysql无法关闭的问题

    mysql关闭不了的解决办法:右键点击电脑的任务栏,打开任务管理器点击服务,找到mysql服务右键点击该服务,选择停止就可以了内容扩展:mac系统mysqld进... [阅读全文]
  • mysql不是内部命令的错误解决方案

    mysql不是内部命令的错误解决方案

    出现mysql不是内部命令的错误是因为没有把mysql的bin目录路径添加到环境变量中解决方法:打开电脑的环境变量,选择系统变量,打开path,将mysql的b... [阅读全文]
  • 关于MySQL主从复制的几种复制方式总结

    关于MySQL主从复制的几种复制方式总结

    异步复制mysql的复制默认是异步的,主从复制至少需要两个mysql服务,这些mysql服务可以分布在不同的服务器上,也可以在同一台服务器上。mysql主从异步... [阅读全文]
  • 详细分析MySQL主从复制

    详细分析MySQL主从复制

    前言:在mysql中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习mysql过程中必不可... [阅读全文]
  • MySQL单表恢复的步骤

    正休息的时候一个电话将我的睡意完全打散,“开发童鞋写update sql的时候忘了加where条件了”,相信每一个dba同学听到这个消息的时候都有骂街的冲动吧。... [阅读全文]
  • MySQL性能优化之如何高效正确的使用索引

    实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作... [阅读全文]
  • MySQL如何优化查询速度

    前面章节我们介绍了如何选择优化的数据类型、如何高效的使用索引,这些对于高性能的mysql来说是必不可少的。 但这些还完全不够,还需要合理的设计查询。 如果查询写... [阅读全文]
  • MySQL优化SQL语句的技巧

    在面对不够优化、或者性能极差的sql语句时,我们通常的想法是将重构这个sql语句,让其查询的结果集和原来保持一样,并且希望sql性能得以提升。而在重构sql时,... [阅读全文]
  • 简述MySql四种事务隔离级别

    隔离级别:隔离性其实比想象的要复杂。 在sql标准中定义了四种隔离级别, 每一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通... [阅读全文]
验证码:
移动技术网