MySQL InnoDB 引擎的持久性与性能
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 引擎的持久性与性能的更多相关文章
- Mysql InnoDB引擎下 事务的隔离级别
mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...
- 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)
该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...
- mysql innodb 引擎
innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...
- MySQL InnoDB引擎锁的总结
为什么要锁 我们开的的各式各样系统中,系统运行需要CPU.内存.I/O.磁盘等等资源.但除了硬资源外,还有最为重要的软资源:数据. 当人们访问操作我们的系统时,其实归根是对数据的查看与生产.那么对于同 ...
- mysql InnoDB引擎 共享表空间和独立表空间(转载)
PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空 ...
- MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...
- [MySQL]InnoDB引擎的行锁和表锁
1.行锁和表锁 在mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描, 行锁则 ...
- MySQL InnoDB引擎B+树索引简单整理说明
本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- mysql InnoDB引擎索引超过长度限制
组合索引长度之和大于 767 bytes并无影响,当有某个字段定义长度大于 767 bytes(1000*3)时,仅产生告警,但不影响创建,超长字段会取前 255 字符作为前缀索引,并且组合索引中字段 ...
随机推荐
- 秒懂HTTPS
http和https HTTP:超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数 ...
- Unity容器在asp.net mvc中的IOC应用及AOP应用
<asp.net-mvc框架揭秘>一书中,有个示例,是使用unity容器来注入自定义的控制器工厂.代码示例可以自己去下载源码,在这里我就不说了.IOC容器的本质是解耦的实例化接口类,而如何 ...
- 【SQL】SQL整表复制
SQL Server中,如果目标表存在: 1 insert into 目标表 select * from 原表; SQL Server中,如果目标表不存在: 1 select * into 目标表 f ...
- SpringBoot整合mongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...
- Django路由详解
一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...
- 洛谷.3369.[模板]普通平衡树(fhq Treap)
题目链接 第一次(2017.12.24): #include<cstdio> #include<cctype> #include<algorithm> //#def ...
- php5.4以下,json_encode不转义实现方法
function json_encode($input){ // 从 PHP 5.4.0 起, 增加了这个选项. if(defined('JSON_UNESCAPED_UNICODE')){ retu ...
- Android笔记--LinearLayout
LinearLayout 即线性布局,让子元素水平或垂直的排列在 layout中,子元素不会换行,当排到末尾时,剩下的组件将不会被显示出来. LinearLayout 常用的属性及方法: XML属性 ...
- shell脚本6--循环,比较
for循环 for var in list; do commands;#使用变量$var done example: for i in {a..z}; do actions; done; 后者 for ...
- .net 4.0 中的特性总结(一):dynamic
在新版本的C#中,dynamic关键词是一个很重要的新特性,现在你可以创建动态对象并在运行时再决定它的类型.而且.net 4.0为CLR加入了一组为动态语言服务的运行时环境,称为DLR(Dynamic ...