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 字符作为前缀索引,并且组合索引中字段 ...
随机推荐
- Linux 中 Windows 中文乱码
Linux 下 Windows 源代码中文乱码 由于 windows 和 linux 对文本的编码方式不同,所以经常会有 windows 中生成的文本在 linux 中打开乱码的情况. 比如: 我面临 ...
- Linux 系统分级及root权限相关
单用户模式修改用户密码 救援模式 让我们先来了解一下linux的运行步骤 1. Linux系统引导的顺序掌握Linux系统引导的顺序:BIOSMBRKernelinit其中,BIOS的工作是检查计算机 ...
- Centos7常用操作
1.装完系统无法用scrt连接服务器 查看IP命令 ip addr [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 ...
- CentOs中玩docker
1.启动: systemctl start docker.service 2.停止: systemctl stop docker 3.从usts上拉取仓库 编辑文件 vi /etc/docker/da ...
- [SP10628]Count on a tree
Description: 给定一颗n个点的树,有m个询问,求任意两点路径上点权第k小的点 Hint: \(n,m<=1e5\) Solution: 比较水 以每个点到根节点的数的前缀和建主席树 ...
- BKDR Hash 函数实现
K&R一书中提出的BKDR Hash算法,这里给出C函数实现,实际用的时候分布比较好而且实现简单.唯一不明白的就是为什么选择131这种模式的数字作为种子,隐隐有沃尔夫勒姆31号自动机的似曾相识 ...
- Java 使用RMI
Java 使用RMI Java使用序列化的方式,可以实现远端的方法调用,在分工合作时非常方便.本文记录使用java标准库实现rmi 一.服务端 结构 . ├── pom.xml ├── src │ ...
- 180400之pycharm快捷方式汇总
1.Pycharm中快捷键大全,遇到一个更新一个 撤销与反撤销:Ctrl + z,Ctrl + Shift + z 缩进.不缩进:Tab.Shift + tab 运行:Shift + F10 批量注释 ...
- GMA Round 1 YGGDRASIL
传送门 YGGDRASIL 在YGGDRASIL世界,一年有213天. Demiurge推广种植了一种植物,姑且称之为“黄金果”,它第一期生长需要140天,此后第i期生长需要的天数$a_i$满足$a_ ...
- mysql [索引优化] -- in or替换为union all
一个文章库,里面有两个表:category和article.category里面有10条分类数据.article里面有 20万条.article里面有一个"article_category& ...