MySQL 事务的 ACID 特性中,D 代表持久性(Durability):在使用 InnoDB 引擎时,当返回客户端一个成功完成事务的确认时, InnoDB 就会保证数据的一致性,即使该数据在此时还没有写入磁盘,因为 InnoDB 引擎的重做日志已经连续地记录了已完成的事务。InnoDB 不是在事务执行的时候直接将数据写入磁盘,即不会立即将更新的数据写入磁盘,而是由 InnoDB 存储引擎的后台 worker 线程负责执行。可以根据在配置文件中的配置来设置日志写入磁盘的频率,默认情况下是每次事务会刷写到磁盘一次。

不同的持久性设置会对数据库的性能产生很大的影响,默认情况下配置文件 my.ini 或 my.cnf 中 innodb_flush_log_at_trx_commit 的值为 1:

mysql> select @@global.innodb_flush_log_at_trx_commit;
+-----------------------------------------+
| @@global.innodb_flush_log_at_trx_commit |
+-----------------------------------------+
| 1 |
+-----------------------------------------+

不同的设置会改变 InnoDB 的持久性和性能,该选项有 3 个值:

1(默认) 对于每个事务日志,InnoDB 都会把日志写入(write)并刷写(flush)到磁盘。速度最慢,但是最持久
2 InnoDB 将所有发生的事务日志写入(write)磁盘,并且每秒对这些数据刷写(flush)一次
0 InnoDB将最近一秒中所发生的所有事务日志写入(write)磁盘,然后将这些日志刷写(flush)到磁盘。

(写日志在 write 时发生 ,写入数据文件到磁盘在操作系统 flush buffer 时发生)

在一些场景下可以通过破坏真正的持久性来显著提高性能。

测试一下 MyISAM 引擎、 InnoDB 引擎(不同持久性下)的插入速度。

测试环境:

CentOS6.6 64-bit/2G

MySQL 5.6.29

mysql> select version();
+------------+
| version() |
+------------+
| 5.6.-log |
+------------+

PHP 7.0.7

[root@localhost test]# php -v
PHP 7.0. (cli) (built: Feb ::) ( NTS )
Copyright (c) - The PHP Group
Zend Engine v3.0.0, Copyright (c) - Zend Technologies

表结构:

MyISAM

    CREATE TABLE `m` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`number` int(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

InnoDB

    CREATE TABLE `i` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`number` int(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

PHP 文件:

<?php 

set_time_limit(0);

$host       = 'localhost';
$user = 'root';
$pwd = 'root';
$database = 'test'; $mysqli = new mysqli($host, $user, $pwd, $database);
if($mysqli->connect_error)
{
die('Connect Error: '.$mysqli->connect_error);
} $table_name = 'example_myisam';
// $table_name = 'example_innodb';
$times = 10000; $sql_truncate = "TRUNCATE TABLE {$table_name}";
$mysqli->query($sql_truncate); $time = -microtime(true);
for($i = 0; $i < $times; $i++)
{
$sql = "INSERT INTO {$table_name} (`number`) VALUES ({$i})";
if(false === $mysqli->query($sql))
{
die('ERROR: '.$mysqli->error);
}
}
$time += microtime(true);
echo '用时',$time,'秒';

分别测试 1w 条数据和 10w 条数据不同情况下所耗费的时间:

   MyISAM  InnoDB.innodb_flush_log_at_trx_commit =1 InnoDB.innodb_flush_log_at_trx_commit =2  InnoDB.innodb_flush_log_at_trx_commit =0 
   第1次 第2次  第3次  平均  第1次  第2次  第3次  平均  第1次  第2次  第3次  平均  第1次  第2次  第3次  平均 
 1w  0.697s  0.722s 0.822s   0.747s  18.204s  19.012s  17.173s  18.130s  0.842s  0.871s  1.058s  0.924s  0.796s 0.795s   0.966s  0.852s
10w   6.579s  6.421s 6.703s  6.568s  201.111s  198.429s  140.926s  180.155s  9.208s  9.566s  9.068s  9.281s  8.022s  7.838s  7.918s  7.926s

MySQL InnoDB 引擎的持久性与性能的更多相关文章

  1. Mysql InnoDB引擎下 事务的隔离级别

    mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

  2. 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)

    该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...

  3. mysql innodb 引擎

    innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...

  4. MySQL InnoDB引擎锁的总结

    为什么要锁 我们开的的各式各样系统中,系统运行需要CPU.内存.I/O.磁盘等等资源.但除了硬资源外,还有最为重要的软资源:数据. 当人们访问操作我们的系统时,其实归根是对数据的查看与生产.那么对于同 ...

  5. mysql InnoDB引擎 共享表空间和独立表空间(转载)

    PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...

  6. MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

    记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...

  7. [MySQL]InnoDB引擎的行锁和表锁

    1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则 ...

  8. MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  9. mysql InnoDB引擎索引超过长度限制

    组合索引长度之和大于 767 bytes并无影响,当有某个字段定义长度大于 767 bytes(1000*3)时,仅产生告警,但不影响创建,超长字段会取前 255 字符作为前缀索引,并且组合索引中字段 ...

随机推荐

  1. ServletContextListener使用详解(监听Tomcat启动、关闭)

    在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期. 当Serv ...

  2. linux学习笔记 apache php mysql +linux

    1 #yum remove httpd 2 #yum -y install httpd php-common php-devel php-gd php-mcrypt php-mbstring php- ...

  3. ps无法存储为PNG

    ps无法存储为PNG,通过各种手段看是否能解决: 第一种:合并图层以后再存储: 第二种:更改存储的名称: 第三种:直接重启ps.

  4. [CC-ADJLEAF2]Adjacent Leaves

    [CC-ADJLEAF2]Adjacent Leaves 题目大意: 给定一棵有根树,考虑从根开始进行DFS,将所有叶子按照被遍历到的顺序排列得到一个序列. 定义一个叶子集合合法,当且仅当存在一种DF ...

  5. 登录页面加密token和盐的作用

    盐: 可以说盐是作用于注册,盐就是将用户输入的原始密码,加密后存进数据库,然后把盐(实际上是随机字符串)也存进数据库 Map<String, String> map = new HashM ...

  6. Java API实现Hadoop文件系统增删改查

    Java API实现Hadoop文件系统增删改查 Hadoop文件系统可以通过shell命令hadoop fs -xx进行操作,同时也提供了Java编程接口 maven配置 <project x ...

  7. quartz详解2:quartz由浅入深

    http://blog.itpub.net/11627468/viewspace-1763498/ 一.quartz核心概念 先来看一张图:     scheduler 任务调度器 trigger 触 ...

  8. 第三届“百越杯”福建省高校网络空间安全大赛writeup--Do you know upload?

    一打开网址,可以看出应该是文件上传漏洞,查看源码,也有可能是文件包含 上传个图片,成功,然后上传一句话木马 通过bp进行上传绕过 , 开始菜刀连接http://e00b6eca3c9c4e14a31c ...

  9. JDK提供的几种线程池比较

    JDK提供的几种线程池 newFixedThreadPool创建一个指定工作线程数量的线程池.每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. ...

  10. 【二分图最大匹配】Bullet @山东省第九届省赛 B

    时间限制: 6 Sec 内存限制: 128 MB 题目描述 In GGO, a world dominated by gun and steel, players are fighting for t ...