之前写过一篇博文,《不好的MySQL过程编写习惯》(http://www.cnblogs.com/wingsless/p/5041838.html)。这篇博文里强调了不要循环的提交事务,尽量将可以放在一起的SQL同一个事务提交,会快很多很多。博文中提到了redo的问题,因此,结合最近编写新员工培训材料的感悟,简单的介绍一些InnoDB和Redo的事情。

InnoDB的内存中有redo log buffer,磁盘上还有redo log file,redo用于在宕机之后恢复数据,保证数据的持久性。

一般来讲,最符合ACID的redo工作方式应该是这样的:事务提交时,内存中的redo buffer内容写入文件中,并刷回磁盘(flush,官方文档中解释该动作是将磁盘缓存的数据flush回文件中)。此时buffer pool中的数据块被修改成为脏页,但是并不写回磁盘中,而是在master thread的循环中慢慢写回去,这样实际上日志的写入和数据文件的写入不是同步进行的,两者之间会有一定的时间差,这种方式就叫做预写日志(WAL)。一旦系统宕机,内存中的数据立刻丢失,下次启动数据库时,没有来得及写回数据文件的数据可以从redo log中恢复。

因此在上篇博文中的过程,会在每一个事务提交时写一次日志,这样会带来很多的磁盘IO,因此效率非常低下,而单个事务提交只会造成一次IO,所以效率提升非常显著。但是,InnoDB还支持另外的一种模式,这个模式由innodb_flush_log_at_trx_commit参数控制,默认情况下是1,代表上面说的那种方式,每次事务提交都会写redo日志。

在一次试验中,我仍然保持存储过程循环提交事务,但是我将参数调整到了2,这样的效率提升也很明显,稍微慢于单事务提交。参数为2的意义是,每次提交事务的时候,也会写日志文件,但是并不调用fsync函数(刷盘的函数)将日志刷回磁盘,而是一秒一次的调度fsync函数。因此也会带来不少的效率提升。这样做的问题很明显,如果遇到宕机,会丢失一秒左右的数据。

当然这个参数还能调整成0,代表事务提交时不作任何操作,每隔一秒才会将redo buffer的数据写入日志并刷回磁盘中。这种方式看起来就明显快的多了,但是却是最不符合ACID原则的做法。

当然了,刷磁盘这个事情还会牵扯一些别的参数,那就不在本文的讨论范围之内了,未来如果有学习心得我会写下来的。

实际上,如果不在乎一秒的数据丢失(一秒的数据有时候真的很多很多),可以将该参数选择为2,但是最好还是选择为1。程序在写数据库的时候,可以采用批量提交的方式,速度非常快。这是程序设计的问题了,也不在讨论范围内了。

InnoDB的WAL方式学习的更多相关文章

  1. Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程

    Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...

  2. HBase WAL原理学习

    1.概述 客户端往RegionServer端提交数据的时候,会写WAL日志,只有当WAL日志写成功以后,客户端才会被告诉提交数据成功,如果写WAL失败会告知客户端提交失败,换句话说这其实是一个数据落地 ...

  3. 白话LINQ系列2---以代码演进方式学习LINQ必备条件

    今天,我们通过一个简单的示例代码的演进过程,来学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式:扩展方法:匿名类型.废话不多说,我们直接进入主题. 一.实现 ...

  4. Android开源项目分包方式学习(eoe、oschina、github)

    总感觉Android中关于分包的文章很少,或者几乎可以说没有.但是合理地分包,又可以使整个项目模块化,减少包与包之间的依赖,让整个项目的框架更加清晰,更利于后续功能的拓展. 因为没有相关的文章,所以这 ...

  5. PHP 数据库驱动、连接数据不同方式学习笔记

    相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.ph ...

  6. 《MySQL技术内幕 InnoDB存储引擎 》学习笔记

    第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...

  7. 非寻常方式学习ApacheTomcat架构及10.0.12源码编译

    概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...

  8. MySQL的MyISAM与InnoDB的索引方式

    在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tr ...

  9. 以最简单方式学习Linux

    有很多关于Linux的书籍,博客.大多数都会比较"粗暴"的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在 ...

随机推荐

  1. 泛函编程(27)-泛函编程模式-Monad Transformer

    经过了一段时间的学习,我们了解了一系列泛函数据类型.我们知道,在所有编程语言中,数据类型是支持软件编程的基础.同样,泛函数据类型Foldable,Monoid,Functor,Applicative, ...

  2. [javaSE] 反射-Class类的基本操作

    获取类的名称 获取该类的方法 获取方法的返回值类型 获取方法的名称 获取方法的参数的类型 package com.tsh.reflect; import java.lang.reflect.Metho ...

  3. tp5页面输出时,搜索后跳转下一页的处理

    tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...

  4. 使用mysql的长连接

    有个资料看得我云里雾里的.现在用自己的言语来总结一下,写文字,能够加深自己的理解.也会在写的过程中帮助自己发现理解方面瑕疵,继续查资料求证. 短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与 ...

  5. 通过angularjs的directive以及service来实现的列表页加载排序分页

    前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...

  6. Error: Error setting TTL index on collection : sessions

    Error: Error setting TTL index on collection : sessions 一.步骤一: 这个问题一般是直接升级 mongodb和connect-mongo的版本为 ...

  7. .net弹出框

    弹出框可以使用div来显示在前台增加 <div id="flowDiv" runat="server"> <div class="r ...

  8. 一款实用的viewer.js 图片相册

    Viewer.js 是一款强大的图片相册插件,像SNS交友网站一般都会用到点击缩略图,弹出层大图片,而且弹出层有多个控制按钮,比如放大缩小.旋转.撤回等,底部有缩略图列表可切换. 支持移动设备触摸事件 ...

  9. ABAP 锁机制

  10. 应用代理 socket TCP协议 的资料

    http://blog.csdn.net/guowake/article/details/6615728 Linux下高并发socket最大连接数所受的各种限制 http://stackoverflo ...