InnoDB的WAL方式学习

之前写过一篇博文,《不好的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。程序在写数据库的时候,可以采用批量提交的方式,速度非常快。这是程序设计的问题了,也不在讨论范围内了。

时间: 2024-09-29 19:38:28

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

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

相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.php http://bbs.phpchina.com/thread-184537-1-1.html http://www.metsky.com/archives/660.html http://www.phpbuilder.com/ http://www.w3school.com.cn/php/php

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

今天我们通一个简单的示例代码的演进过程,来学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式:扩展方法:匿名类型.废话不多说,我们直接进入主题. 一.实现要求 1.获取全部女生: 2.对满足要求的结果按年龄排序: 3.获取结果的前两名: 4.对获取结果计算平均年龄: 5.输出结果信息,包含姓名.性别.年龄: 说明:学生类为Student(包含学生完整信息),输出结果类为:StudentInfo(包含我们关心的信息,后面将演示它是如何消失的).在此我们不讨

MySQL的MyISAM与InnoDB的索引方式

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意.可以看出MyISAM的索引文件仅仅保存数据记录的地址.在MyISAM中,主索引和辅助索引(Se

病毒资源感染方式学习笔记

本文学习自:关于感染型病毒的那些事(三) by gaa_ra 代码也来自gaa_ra 资源感染,就是将宿主程序作为病毒程序的一个资源来保存,将附加了宿主程序的病毒程序覆盖原来的宿主程序,当打开病毒文件时,病毒发作并将宿主程序释放出来运行. 进行资源感染后,打开感染文件的过程大致如下: CreateFile创建资源文件,用于存放要被释放出来的宿主文件 --> FindResource查找该资源 --> LoadResource --> SizeofResource --> Write

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

第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP(联机事务处理,面向基本的.日常的事务处理) 支持事务,支持外键.支持行锁(有的情况下也会锁住整个表).非锁定读(默认读取操作不会产生锁) 通过使用MVCC来获取高并发性,并且实现sql标准的4种隔离级别,默认为可重复读级别 使用一种被称成next-key locking的策略来避免幻读(phant

以最简单方式学习Linux

有很多关于Linux的书籍,博客.大多数都会比较"粗暴"的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机. 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作. 大多数初学者在刚刚接触Linux都会有非常陌生的感觉.往往会有一些疑惑和问题.而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽. 问题1: Winows有注册表,为

安卓开发常见布局方式学习

在安卓开发中我们常用的布局方式有这么几种: 1.LinearLayout ( 线性布局 ) :(里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角) 线性布局分为水平线性和垂直线性二者的属性分别为: android:orientation= " horizontal " android:orientation= "vertical" . 2.RelativeLayout ( 相对布局 ) : (里面可以放多个控件,但是一行只能放一个控件) 附加几类

前置病毒感染方式学习笔记

本文学习自:关于PE病毒的编写学习(一~六) by yangbostar 代码也来源于此,经过一些修改,还不是很完善.如没有添加感染标记,检查感染的文件是否已被感染过. 前置病毒,和资源感染类似,资源感染是病毒把宿主程序添加到程序的资源中,替换覆盖原程序,运行时将宿主程序释放成一个临时文件运行.前置病毒是读取病毒和宿主程序数据,然后将病毒和宿主程序数据再以病毒 --> 宿主程序的顺序写入宿主程序文件,运行时创建一个临时文件,读取程序中宿主程序的数据写入临时文件运行. 文件型病毒至少有这四个模块:

输入数字 判断正负个数 三种方式 学习笔记

import java.util.Scanner; class  TestExer{ public static void main(String[] args) { Scanner s= new Scanner(System.in); int a = 0; int b = 0; //for(;;){  for 无限循环 输入0 终止 while(true){  //for无限循环改为while无限循环 输入0终止 System.out.println("请输入一个整数"); int