1:创建表和存储过程

mysql> create database trx;
Query OK, 1 row affected (0.02 sec) mysql> USE trx
Database changed
mysql> CREATE TABLE test_trx(
-> id int(5),
-> uname char(30))
-> engine =innodb;
Query OK, 0 rows affected (0.01 sec) mysql> DROP PROCEDURE IF EXISTS pro_trx $$
Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS pro_trx $$
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE PROCEDURE pro_trx(count int UNSIGNED)
-> BEGIN
-> DECLARE fir INT UNSIGNED DEFAULT 1;
-> DECLARE sec CHAR(50) DEFAULT REPEAT('id',50);
-> WHILE fir <= count
-> DO
-> INSERT INTO test_trx SELECT null,fir;
-> COMMIT;
-> SET fir = fir+1;
-> END WHILE;
-> END;
-> $$
Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;

  

2:

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)

  

设置为0

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 0;
Query OK, 0 rows affected (0.00 sec) 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 pro_trx(100000);
Query OK, 0 rows affected (10.20 sec)

  

设置为1:

mysql> SET GLOBAL innodb_flush_log_at_trx_commit =1;
Query OK, 0 rows affected (0.00 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 pro_trx(100000);
Query OK, 0 rows affected (4 min 45.12 sec)

设置为2:

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 2;
Query OK, 0 rows affected (0.00 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.00 sec)

  

mysql> CALL pro_trx(100000);
Query OK, 0 rows affected (13.80 sec)

  

重新设置为0:观察下

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 0;
Query OK, 0 rows affected (0.00 sec) 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 pro_trx(100000);
Query OK, 0 rows affected (10.25 sec)

  

innodb_flush_log_at_trx_commit设置为不同的值,性能差别很明显。

可以通过设置为0或者2来提高事物提高性能。但是这种设置丧失了ACID特性。而针对上述存储过程,为了提高事物的提交性能,应该在将10万行记录插入表后进行一次的COMMIT操作。而不是每插入一条就提交一次。这样做的优点是事物可以回滚到最初的状态。

2:改写一下存储过程

mysql> DELIMITER $$
mysql> DROP PROCEDURE IF EXISTS pro_trx_one_commit$$
Query OK, 0 rows affected, 1 warning (0.00 sec)

  

mysql> CREATE PROCEDURE pro_trx_one_commit(count int UNSIGNED)
-> BEGIN
-> DECLARE fir INT UNSIGNED DEFAULT 1;
-> DECLARE sec CHAR(50) DEFAULT REPEAT('id',50);
-> WHILE fir <=count
-> DO
-> INSERT INTO test_trx SELECT null,fir;
-> SET fir = fir+1;
-> END WHILE;
-> COMMIT;
-> END;
-> $$
Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;

  

innodb_flush_log_at_trx_commit 设置为0:

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 0;
Query OK, 0 rows affected (0.00 sec) 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 pro_trx_one_commit(100000);
Query OK, 0 rows affected (10.19 sec)

  

innodb_flush_log_at_trx_commit 设置为1:

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 1;
Query OK, 0 rows affected (0.00 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 pro_trx_one_commit(100000);
Query OK, 0 rows affected (5 min 27.33 sec)

  

innodb_flush_log_at_trx_commit 设置为2:

mysql> CALL pro_trx_one_commit(100000);
Query OK, 0 rows affected (13.50 sec)

  

3:再次改写存储过程

mysql> DELIMITER $$
mysql> CREATE PROCEDURE pro_trx_no_commit(count int UNSIGNED)
-> BEGIN
-> DECLARE fir INT UNSIGNED DEFAULT 1;
-> DECLARE sec CHAR(50) DEFAULT REPEAT('id',50);
-> WHILE fir <=count
-> DO
-> INSERT INTO test_trx SELECT null,fir;
-> SET fir = fir+1;
-> END WHILE;
-> END;
-> $$
Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ;

  

mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 1;
Query OK, 0 rows affected (0.00 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 pro_trx_no_commit(100000)  ;
Query OK, 1 row affected (4 min 55.05 sec)

  

mysql> SHOW VARIABLES LIKE '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | ON |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
3 rows in set (0.00 sec)

  

mysql> SET GLOBAL autocommit = OFF;
Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | ON |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
3 rows in set (0.00 sec)
另外开一个连接
mysql> SHOW VARIABLES LIKE '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | OFF |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
3 rows in set (0.00 sec)

  

把自动提交关掉之后重新调用存储过程查看性能:

mysql> CALL pro_trx_no_commit(100000);
Query OK, 1 row affected (2.66 sec)

  

mysql> USE trx
Database changed
mysql> CALL pro_trx_no_commit(100000);
Query OK, 1 row affected (2.66 sec) mysql> CALL pro_trx_one_commit(100000);
Query OK, 0 rows affected (2.48 sec) mysql> CALL pro_trx(100000);
Query OK, 0 rows affected (4 min 47.90 sec)

  

MySQL事物系列:3:innodb_flush_log_at_trx_commit小实验的更多相关文章

  1. MySQL事物系列:2:事物的实现

    1:事物的隔离性由锁来实现.事物的持久性和事物的原子性通过redo log来实现.事物的一致性通过undo log来实现. redo log恢复提交事物修改的页操作 undo log回滚到行记录某个特 ...

  2. MySQL事物系列:1:事物简介

    1:事物是一组SQL的集合,要么都执行,要么都不执行.有ACID4个特性,即:原子性.一致性.隔离性.持久性. A(Atomicity)原子性:整个事物是不可分割的工作单位. C(consistenc ...

  3. 修改MySQL表varchar字段的小实验

    将actor表的first_name的varchar(45) ,修改为varchar(60) [root@vhost1 ~]# mysql -uroot -p -S /mysqldata/tmp/my ...

  4. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  5. Mysql备份系列(1)--备份方案总结性梳理

    mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...

  6. MySQL事物原理及事务隔离级别

    mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...

  7. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  8. 30个Python物联网小实验5:光线感应灯

    30个Python物联网小实验5:光线感应灯 光线传感器 光线变化执行函数 光线状态执行函数 30个Python物联网小实验5:光线感应灯 光线传感器 可以检测周围环境的亮度: 方向性较好,感知特定方 ...

  9. 30个物联网传感器小实验:三行代码点亮LED灯

    30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...

随机推荐

  1. 找了一个api管理工具

    找了一个工具,https://github.com/nutsteam/apiManager选择了如下方式,进行了安装. ● 下载https://git.oschina.net/zhoujingjie/ ...

  2. windows下apk查看工具的原理

    游戏出了版本之后,提供给渠道,有部分渠道会修改包名(当他们内部系统做出调整后,可能会改包名),这个时候我又需要知道包名.之前没办法,试图反编译apk,发现失败了.然后就安装apk到手机上,手机上再下载 ...

  3. nginx 413 500报错

    采用nginx作反向代理,出现了一个诡异的问题,小文件可以提交,大文件会报500内部错误.这个是什么原因导致的呢? 查wiki可知,上传文件大小相关的有三个配置 client_body_buffer_ ...

  4. easyUi 的DataGrid的绑定

    html代码: @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Index_Layout.cshtml&quo ...

  5. 让java从Mysql返回多个ResultSet

    首先,JDBC对于SQLSERVER来说默认是支持返回,但对于MySql来说,只默认支持存储过程返回多个ResultSet,那对于手写SQL怎么办. 其实很简单,只要一个在连接字符串中加一个参数:al ...

  6. Protobuf 协议语言指南

    l  定义一个消息(message)类型 l  标量值类型 l  Optional 的字段及默认值 l  枚举 l  使用其他消息类型 l  嵌套类型 l  更新一个消息类型 l  扩展 l  包(p ...

  7. C++对带有分隔符的字符串 分割为数字的通用解决方案

    需求: 数据库取出的字段类似于 "1,3,4" 然后用数字处理后,,比如 "1,2,3" 再存回去 #include<stdio.h> #inclu ...

  8. 试用ArcGIS Server 10.1 X64 for windows

    ArcGIS 10.1 发布已经很久了,其Server只支持x64,为此我还专门下载安装了windows Server 2003 x64,进行安装测试. 我测试了集群功能,比起10.0 ,没有使用域控 ...

  9. Validate Binary Search Tree leetcode java

    题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...

  10. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: ...