MySQL事物系列:3:innodb_flush_log_at_trx_commit小实验

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)

  

时间: 2024-10-13 10:40:33

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

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

Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳理Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录 废话不多说,下面即是使用lvm-snapshot快照方式备份mysql的操作记录,仅依据本人实验中使用而述. 操作记录:如下环

mysql事物

MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务.行级锁.并发 3.Berkeley DB:支持事务 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败.实际上,会俱乐部许多SQL查询到一个组中,将执行所有的人都一起作为事务的一部分. 事务的特性: 事务有以下四个

MySQL搭建系列之多实例

所谓多实例,就是在一台服务器上搭建.运行多个MySQL实例,每个实例使用不同的服务端口,通过不同的socket监听:物理上,每个实例拥有独立的参数配置文件及数据库. 通常情况下,一台服务器是不建议运行多个MySQL实例的,尤其是生产环境,因为这会造成资源相互强占问题.但在一些高可用环境中,却有这样的需求,比如:利用Heartbeat搭建的故障转移集群环境,若主备服务器只运行一个MySQL实例,则备用服务器平常处于闲置状态,造成了资源浪费:若各自运行一个MySQL实例,则在一方故障时,要求另一方接

Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化

Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化  大 | 中 | 小  [ 2008-10-28 16:55 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2008.10.28 转载请注明原文链接:http://blog.zyan.cc/post/375/] VPS(全称Virtual Private Server)是利用最新虚拟化技术在一台物理服务器上创建多个相互隔离的虚拟私有主机.它们以最

MySQL锁系列2 表锁

上一篇介绍了MySQL源码中保护内存结构或变量的锁,这里开始介绍下MySQL事务中的表锁. 注1: 在表锁的实现上面,使用[mutex+condition+queue]的结构实现并发,阻塞,唤醒的表锁功能. 注2: 本文进行的一些实验,重要的配置项: 1. autocommit=0 2. tx_isolation=read-commited 3. engine=innodb 1. MySQL加锁的顺序: 这里包括了一个sql在执行的过程中,包括commit,所添加和释放跟事务相关的锁以及加不同锁

mysql fetch 系列函数

浏览器输出内容同上. 当使用 MYSQL_BOTH 或省略该参数是,将同时具有 MYSQL_NUM 与 MYSQL_ ASSOC 的特性. MySQL mysql_fetch_array 函数取得查询结果中的一行作为数组 mysql_fetch_* 列函数 mysql_fetch_* 列函数的主要功能是从查询返回的结果集中取得相关的查询结果,主要包括: mysql_fetch_array():从结果集中取得一行作为关联数组或索引数组,或二者兼有 mysql_fetch_row():从结果集中取得

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

30个Python物联网小实验5:光线感应灯 光线传感器 光线变化执行函数 光线状态执行函数 30个Python物联网小实验5:光线感应灯 光线传感器 可以检测周围环境的亮度: 方向性较好,感知特定方向的亮度: 灵敏度可调,用螺丝刀旋转图中蓝色电位器即可: 工作电压:3.3v~5v 数字开关输出:0或1 设有固定螺栓孔,方便安装 光线变化执行函数 接线方法:正极接树莓派的5v正极,负极接树莓派的GND地线,信号输出针脚接GPIO18号口. 上代码: from gpiozero import Li

lamp综合小实验

lamp综合小实验 <font color=red>禁止转载,禁止搬运</font> 遇到的问题: 一.浏览器打不开blog.jd.com:已经配置DNS,最终原因:这个图形化的CentOS7使用dncp获取的ip,DNS也获取的网关:解决:固定IP,手动设置DNS,并确认/etc/reslov.conf 二.NFS权限问题php对NFS目录没有写权限:最终解决:php是以apache运行的,NFS那边也创建个一模一样的apache并对/data/wordpress设置acl权限

DCDC纹波小实验

关于使用示波器测试纹波的注意事项 使用示波器的AC耦合方式测量 由于示波器的头套容易引人噪声,因此在测试前必需把探头的头套去掉 因为电源的高频噪声很容易通过小电感就可以滤掉,因此更关心的是中低频的噪声.测试时将示波器的带宽限制调到尽可能的低(20MHz),避免从表笔引入噪声(我之前就吃过这方面的亏) DCDC后端接LDO AMS1117-5V的Datasheet上要求的最低压差(VIN-VOUT)为1.1V到1.25V,这就要求输入要大于5V+1.1V=6.1V,如果输入不满足这个条件会怎么样呢