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. android应用推荐

    脱单宝典: http://file.bmob.cn/M00/D5/1E/oYYBAFR27BOAPu1JACq_bnF_6-E971.apk

  2. 黑马day17 ajax&amp;实现username自己主动刷新

    1. regist.jsp文件 <%@ page language="java" pageEncoding="utf-8"%> <!DOCTY ...

  3. 《软件定义网络:SDN与OpenFlow解析》

    <软件定义网络:SDN与OpenFlow解析> 基本信息 原书名:SDN: Software Defined Networks 原出版社: O'Reilly Media 作者: (美)Th ...

  4. [Web 前端] 前端频道之团队维护、聚合、订阅

    cp from :https://blog.csdn.net/ivan820819/article/details/78885404 国内 腾讯 ISUX 腾讯全端 AlloyTeam 奇舞周刊 阿里 ...

  5. Java命令学习系列(四)——jstat

    jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...

  6. H2:开源内存数据库引擎

    本资源由 伯乐在线 - 刘立华 整理 H2是一个开源的内存数据库.Java编写.快速.小巧(1.5MB jar包)还提供了Web控制台管理数据库内容. 主要功能 非常快速的数据库引擎. 开源. Jav ...

  7. Linux常用命令汇总 - Linux Shell Cheat Sheet

    1. 查看Linux操作系统信息: uname -a cat /proc/version lsb_release -a 2. 设置ls显示的文件夹的颜色(将下面这条目录加在 .bashrc 文件最后) ...

  8. window.name实现的跨域数据传输 JavaScript跨域总结与解决办法

    原文地址:  http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m4 什么是跨域 1.document.domain+ifr ...

  9. C++ 模板学习 函数模板、类模板、迭代器模板

    使用模板能够极大到使得代码可重用. 记录一下,方便后续使用. 1. 函数模板,支持多种类型参数 #include <stdio.h> #include <math.h> //函 ...

  10. Cantor展开式

    X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n).这就是康托展开 ...