InnoDB的重做日志刷新策略对插入速度的影响

核心控制参数

  InnoDB存储引擎通过innodb_flush_log_at_trx_commit参数控制重做日志刷新到磁盘的策略

  查看参数值:

show variables like ‘innodb_flush_log_at_trx_commit‘;

  修改参数值:

set GLOBAL innodb_flush_log_at_trx_commit = 1;

三种刷新策略

  策略一:参数值为0,表示事务提交时不强制一定要写入到重做日志,刷新到磁盘的时间控制有master thread控制,master thread会在每隔1秒进行同步刷新操作。

  策略二:参数值为1,表示事务提交时必须将该事务的所有日志写入到磁盘中。

  策略三:参数值为2,表示事务提交时将重做日志写入到重做日志文件,但仅仅是写入到文件系统的缓存中,不立刻进行同步刷新操作。

测试用例

  创建表load_data表用来存储数据:

CREATE TABLE load_data (
    id INT UNSIGNED,
    data CHAR(100)
);

  创建存储过程loadData用来加载数据:

CREATE PROCEDURE loadData(number INT UNSIGNED)
BEGIN
DECLARE i INT UNSIGNED DEFAULT 1;
DECLARE v CHAR(100) DEFAULT REPEAT (‘t‘, 100);
WHILE i <= number DO
INSERT INTO load_data SELECT i, v;
COMMIT;
SET i = i + 1;
END WHILE;
END;

插入100万条数据的速度比较

  策略一的测试:

mysql> show variables like ‘innodb_flush_log_at_trx_commit‘;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 0     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> call loadData(1000000);
Query OK, 0 rows affected (38.84 sec)

  策略二的测试(不能忍,都看了一集电视剧了):

mysql> show variables like ‘innodb_flush_log_at_trx_commit‘;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> call loadData(1000000);
Query OK, 0 rows affected (31 min 38.67 sec)

  策略三的测试:

mysql> show variables like ‘innodb_flush_log_at_trx_commit‘;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.03 sec)

mysql> call loadData(1000000);
Query OK, 0 rows affected (1 min 34.67 sec)

各策略的优缺点

  策略一:明显速度上比策略二快很多,因为少了很多刷新到磁盘的IO操作,这些IO操作的代价是很大的,很浪费时间,策略一在这点上省了不少的时间,但是代价就是可能会发生在最后一秒内事务丢失的情况,这样就不符合了事务的持久性。如果那一秒刚好接了1000万的单子,结果服务器死机了,找不回这条数据了,就只能呵呵了。

  策略二:优点很明显,就是严重的符合了事务的持久性,每次都写入重做日志,当宕机情况出现的时候,可以准确的恢复。缺点也很明显,就是付出的时间代价很大。

  策略三:利用缓存机制减少了不必要的IO操作,或者说是将多个IO操作合并成一个IO,提高了速率。缺点就是发生宕机的时候会丢失还没有从文件系统缓存刷新到重做日志的那一份数据。

  总的来说,每种策略的存在都有其存在的道理。存在就是合理的,各种策略都有它应用的情景,只能了解了他们的情况,才能更好使用这些策略。

时间: 2024-08-25 17:29:37

InnoDB的重做日志刷新策略对插入速度的影响的相关文章

InnoDB存储引擎的表空间文件,重做日志文件

存储引擎文件:因为MySQL表存储引擎的关系,每个存储引擎都会有自己的文件来保存各种数据.这些存储引擎真正存储了数据和索引等数据. 表空间文件 InnoDB存储引擎在存储设计上模仿了Oracle,将存储的数据按表空间进行存放.默认配置下,会有一个初始化大小为10MB.名为ibdata1的文件.该文件就是默认的表空间文件(tablespace file).你可以通过参数innodb_data_file_path对其进行设置.格式如下: innodb_data_file_path=datafile_

MySQL系列:innodb源码分析之重做日志结构

在innodb的引擎实现中,为了实现事务的持久性,构建了重做日志系统.重做日志由两部分组成:内存日志缓冲区(redo log buffer)和重做日志文件.这样设计的目的显而易见,日志缓冲区是为了加快写日志的速度,而重做日志文件为日志数据提供持久化的作用.在innodb的重做日志系统中,为了更好实现日志的易恢复性.安全性和持久化性,引入了以下几个概念:LSN.log block.日志文件组.checkpoint和归档日志.以下我们分别一一来进行分析. 1.LSN 在innodb中的重做日志系统中

人工误删除InnoDB ibdata数据文件与ib_logile重做日志文件如何恢复详细过程

有人因为不熟悉InnoDB引擎,而误删除innoDB ibdata(数据文件)和ib_logfile(redo log重做事务日志文件),结果导致了悲剧的发生.如果有做主从复制同步那还好,如果是单机呢?如何恢复? 1)使用rm –f ib* 删除数据文件和重做日志文件 下面就来使用具体看看如何恢复. 若此时你发现数据库还可以正常工作,数据照样可以写入,切记,这时千万别把mysqld进程杀死,否则没法挽救. 先找到mysqld的进程pid,如下所示. mysql01:/data/mysql3306

重做日志缓冲中的内容何时刷新到重做日志文件中

1 master thread 每一秒将重做日志缓冲刷新到重做日志文件; 2 每个事务提交时 3 当重做日志缓冲池剩余空间小于1/2时

减少插入语句生成重做日志的方法小结

下面是根据自己的测试和别人的经验进行总结的重做日志文件(redo log file)对Oracle数据库来说至关重要,它们是数据库的事务日志.Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件.这两类重做日志文件都用于恢复:其主要目的是,万一实例失败或介质失败,它们就能派上用场.如果数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恰好恢复到掉电之前的那个时间点.如果磁盘驱动器出现故障(这是一个介质失败),Oracle会

关于Mysql表InnoDB下插入速度慢的解决方案

最近做了 server_log 日志数据库记录,仅仅插入,由平台来获取数据进行分析的需求. 但是内部反馈插入数据库记录非常耗时,我就很纳闷了,一个insert怎么会 30-50ms 呢?按说应该在 0.5ms 以内的: 经过分析,发现是InnoDB数据库的Row_Format格式问题,改为MyISAM表就可以了,但是InnoDB是支持事务的,一般是推荐InnoDB的,好奇为什么. 而且InnoDB的表,只能选择 COMPACT 和REDUNDANT 两种行格式(RoW_FORMAT). 经过搜索

mysql的innodb中事务日志ib_logfile

mysql的innodb中事务日志ib_logfile事务日志或称redo日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在,可以手工修改参数,调节开启几组日志来服务于当前mysql数据库,mysql采用顺序,循环写方式,每开启一个事务时,会把一些相关信息记录事务日志中(记录对数据文件数据修改的物理位置或叫做偏移量);作用:在系统崩溃重启时,作事务重做:在系统正常时,每次checkpoint时间点,会将之前写入事务应用到数据文件中.引入一个问题:在m/s环境中,in

Mysql 重做日志及与二进制日志的区别

Mysql 重做日志及与二进制日志的区别(转http://blog.uouo123.com/post/623.html) Mysql默认情况下会有两个文件:ib_logfile0和ib_logfile1,这两个文件就是重做日志文件,或者事务日志. 重做日志的目的:万一实例或者介质失败,重做日志文件就能派上用场. 每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,如默认的ib_logfile0.ib_logfile1.InnoDB存储引擎先写重做日志文件1,当达

MySQL重做日志相关

Ⅰ.事务的实现 这里我们先抛出答案,通过答案再展开分析 特性 实现 A(原子性) redo C(一致性) undo I(隔离性) lock D(持久性) redo/undo 本节针对redo展开分析 Ⅱ.redo详解 2.1 redo log buffer redo就是我们常说的重做日志,用来实现持久性 mysql目录下两个ib_logfile文件,就是重做日志文件,在ssd场景下至少设置为4G redo log里面记录的是每个page修改操作的物理逻辑日志(不是完全的二进制的差异值,比如一个s