之前写过一篇博文,《不好的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. Git submodule 特性

    当你习惯了代码的 VCS 后,基本上是离不开的. 作为一个依赖多个子项目组成的项目,要实现直观的代码逻辑结构,可以考虑使用 Git submodule 特性. 当然,如果只是单独的依赖的话,用依赖管理 ...

  2. 高性能的分布式服务框架 Dubbo

    我思故我在,提问启迪思考! 1. 什么是Dubbo? 官网:http://dubbo.io/,DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的 ...

  3. node.js 抓取网页数据

    var $ = require('jquery'); var request = require('request'); request({ url: 'http:\\www.baidu.com',/ ...

  4. phpcms 二次开发数据过滤的技巧

    参数过滤 1,针对不能直接使用pdo进行参数绑定,可以使用sprintf模拟,并使用new_addslashes来过滤,然后使用query执行拼接的sql %% - 返回百分比符号 %b - 二进制数 ...

  5. windows server 2003安装sp4时的问题

    "以前进行的程序安装创建了挂起的文件操作.运行程序之前,必须重新起动计算机."的解决办法 在安装SQL 2000数据库和SQLSP4补丁时,经常会提示“以前进行的程序安装创建了挂起 ...

  6. Eclipse安装SVN插件及使用说明

    1.下载Eclipse,如果没有安装的请到这里下载安装:http://eclipse.org/downloads/ ,关于Eclipse的下载安装不再赘述. 2.下载SVN插件subclipse,安装 ...

  7. jenkins 邮件配置

    jenkins 自带一个邮件的通知的功能,但是自带的邮件通知功能,有点简单不能自定义信息,所以我们安装邮件插件Email-ext plugin.1.首先在系统管理-插件管理-安装Email-ext p ...

  8. sql2012还原sql2008备份文件语句

    --sql2012还原sql2008语句 --选择master数据库,新建查询 输入下面sql语句 --选择兼容模式(sql 2008)创建数据库db RESTORE DATABASE db FROM ...

  9. spring常用注解使用解析

    spring没有采用约定优于配置的策略,spring要求显示指定搜索哪些路径下的Java文件.spring将会把合适的java类全部注册成spring Bean.   问题:spring怎么知道把哪些 ...

  10. 20个免费的 JavaScript 游戏引擎分享给开发者

    这篇文章收集了20个免费的 JavaScript 游戏引擎分享给开发者.这些游戏引擎能够帮助游戏开发人员更快速高效的开发出各种好玩的游戏. 使用 HTML5.CSS3 和 Javascript 可以帮 ...