阅读完文章后,自己的一些小记录。原文 一条更新语句的执行流程与查询流程类似 一条SQL查询语句是如何执行的 记账例子: 如果有人要赊账或者还账的话,掌柜一般有两种做法: 当声音红火时,选择先把帐记在白板上,等闲的时候再写到账本。 粉板和账本配合的整个过程,就是MySQL里的WAL技术,Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。 当有新记录需要更新时,InnoDB引擎会将记录写到redo log(粉板)里,并更新内存,这时更新就算完成了。然后InnoDB引擎会在系统比较空闲的时候,将操作记录更新到磁盘。 如果某天赊账的特别多,粉板写满了,这个时候就由不得你空闲了,只好放下手中活,把粉板中的一部分赊账记录更新到账本中,然后把这些记录从粉板上擦掉,为记新账腾出空间。这个原因,也是我们sql语句偶尔出现很慢的原因,可能是在清理redo log日志 InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么这块“粉板”总共就可以记录4GB的操作。从头开始写,写到末尾就又回到开头循环写。 redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,称为binlog(归档日志) 重点来了,为什么要有两份日志? update T set c=c+1 where ID=2; 这条语句是怎么执行的呢? 浅色框在InnoDB内部执行的,深色框在执行器中执行的 两阶段提交的作用是让两份日志的逻辑一致! 可以看到,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。
前言
与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和binlog(归档日志)redo log
酒店掌柜有一个粉板,专门用来记录客人的赊账记录。如果赊账的人不多,那么他可以把顾客名和账目写在板上。但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。
redo log可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe重要的日志模块:binlog
MySQL自带的引擎是MyISAM,MyISAM并没有crash-safe的能力
两种日志的差异:
redo log的写入拆成了两个步骤:prepare和commit,这就是”两阶段提交”。两阶段提交
为什么日志需要“两阶段提交”。这里不妨用反证法来进行解释。
-先写binlog后写redo log。如果在binlog写完之后crash,由于redo log还没写,崩溃恢复以后这个事务无效。但是binlog里面已经记录了。所以,在之后用binlog来恢复的时候就多了一个事务出来,恢复出来的值,与原库的值不同。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算