MySQL中的DML语句执行流程

北京专科扁平疣医院 http://m.39.net/pf/a_8744638.html

redolog和binlog

在DML语句执行的过程中,主要会涉及到两个日志——,而这两个日志是数据库WAL(WriteAheadLogging,先写日志再写磁盘提高效率)技术的两大主角。下面我来介绍一下这两个日志。

redolog(重做日志)

类型:数据页级别的,记录的是物理日志(比如某个数据做了是什么更改)。

作用:确保事务的持久性,防止在数据库crash的时候上有脏页未写入磁盘,在重启MySQL的时候会根据redolog进行重做。

产生时间:在事务开始的时候就会产生,而redolog的落盘不是在事务提交的时候,而是在事务执行过程中就会进行redolog的写入。

释放时间:当内存中的脏页都写入磁盘了,那么相应的redolog就会被覆盖。

注意:这里为什么说是覆盖是因为redolog写日志的特性。redolog的大小是固定的,所以写redolog是循环的覆盖写,你可以理解为,一个环形文件如下图。

其中,整个环形是两个文件构成的(文件个数和文件大小你可以自己指定),两个文件像连在一起一样,其中绿色标识的是checkpoint,用来表示当前日志被清理到的头(可以理解为当前有用的redolog的头),而writeposition代表着当前写入位置(就是当前有用redolog的尾)。如果数据库有更新那么writeposition就会向前推,如果writeposition要追上checkpoint的时候,那么数据库就会停下来将checkpoint向前推(就是清理,此时就是将内存中的脏页进行写入磁盘,对应着上面的释放时间)。

binlog

binlog默认是关闭的,需要在配置文件自己设置。

类型:数据行级别的,逻辑日志(有两种形式,一种是statement,记录着sql语句,另一种是row,记录着数据行更新前和更新后的内容)。

作用:主要用于实现MySQL主从复制,数据备份和数据恢复。

产生时间:在一个事务提交的时候会被写入磁盘。

释放时间:是追加写的,所以不会被覆盖,无释放时间。

DML的执行流程

如果你对MySQL的这两个日志没有了解过的话,上面的特性是很难理解的,如果结合着DML语句执行流程就会好理解一点,比如我现在要在数据库的表中更新id=1这一行中的value字段。

updatetablesetvalue=value+1whereid=1;

这个时候更新的大致流程就是这样的

首先MySQL的server层会通过调用执行器去获取指定数据行

苦差事当然交给引擎(这里是innodb)来做,InnoDB首先会去查看当前内存中是否存在该数据行,如果存在之间从内存中取出,如果不在那么会从磁盘中load到内存之后再从内存中取出相应数据行。

然后将数据行进行更新并将新行写入内存中(注意此时肯定会产生脏页,后面会了解到)。

之后就会开始写日志,首先是redolog的写入(*此时进入prepare状态**)。

第二个写binlog。

最后进行事务的提交。

注意:这里的事务提交不仅仅是简单的


转载请注明:http://www.aierlanlan.com/cyrz/4247.html

  • 上一篇文章:
  •   
  • 下一篇文章: