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. SpringBoot整合elasticsearch

    在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows ...

  2. react-router那些事儿

    切换路由时,控制台警告 Can Only update a mounted or mounting component.this usually means you called setState() ...

  3. 241. String to Integer

    描述 Given a string, convert it to an integer. * You may assume the string is a valid integer number t ...

  4. 洛谷.3369.[模板]普通平衡树(Splay)

    题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...

  5. phtnon 文件操作

    1.文件定义 (1).什么是文件? 文件是操作系统为用户或者应用程序提供一个读写硬盘的虚拟单位 文件的核心就是读写,即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程 ...

  6. Linux之经典互联网架构

    经典互联网架构 netstat -tulnp |grep 80ss -tulnp|grep 80 前期铺垫: 1. Linux要能上网2. 掌握Linux软件包安装方法2.1 rpm包管理 2.1.1 ...

  7. [Java]Java分层概念(转)

    service是业务层 action层即作为控制器 DAO (Data Access Object) 数据访问 1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分 ...

  8. json串转化成xml文件、xml文件转换成json串

    1.json串转化成xml文件 p=[{"name":"tom","age":30,"sex":"男" ...

  9. JDBC(14)—对DAO进行改进修改

    结构: DAO2_7< T >(接口)->DAOTestImpl< T >(实现类)->CustomerDAO(继承的子类)->CustomerDAOTest ...

  10. 通过TopShelf快速开发服务程序

    我之前在文章中介绍过使用NSSM将exe封装为服务,这种方式我个人是比较喜欢的,一来原始文件不受服务的开发约束,二来也可以提供简单的日志系统.线程守护等功能,是我个人比较倾向的行为.但是,有的场景下, ...