前段时间把数据库的部分myisam表转变成了innodb了,感觉慢了好多。我知道autocommit对innodb性能有一定的影响,但不知道影响有这么大。如何关闭autocommit,请参考mysql禁用autocommit,以及遇到的问题
,为了解决这个问题,我做了一些测试,包括autocommit对myisam,innodb影响。
一,测试autocommit对myisam的影响
1,准备测试表和数据
mysql> CREATE TABLE `test_test` ( //测试表
-> `id` int(11) NOT NULL auto_increment,
-> `num` int(11) NOT NULL default '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ||
mysql> create procedure p_test(pa int(11))
-> begin
->
-> declare max_num int(11) default 100000;
-> declare i int default 0;
-> declare rand_num int;
->
-> select count(id) into max_num from test_test;
->
-> while i < pa do
-> if max_num < 100000 then
-> select cast(rand()*100 as unsigned) into rand_num;
-> insert into test_test(num)values(rand_num);
-> end if;
-> set i = i +1;
-> end while;
-> end||
Query OK, 0 rows affected (0.03 sec
2,测试autocommit开启的情况
mysql> call p_test(100000)|| //插入10000条数据
Query OK, 1 row affected (0.86 sec)
mysql> truncate table test_test; //清空表
Query OK, 0 rows affected (0.00 sec)
mysql> optimize table test_test; //优化一下表,收回资源,确保测试的公平性
这样我连续做了三次测试,平均一下插入10000的数据差不多要0.86秒
。关于optimize来优化表,请参考optimize table在优化mysql时很重要
3,autocommit关闭的情况下
mysql> call p_test(100000)|| //插入10000条数据
Query OK, 1 row affected (0.83 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> truncate table test_test; //清空表
Query OK, 0 rows affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> optimize table test_test; //优化一下表,收回资源,确保测试的公平性
这样我连续做了三次测试,平均一下插入10000的数据差不多要0.83秒
。为了使init_connect='SET autocommit=0'
启作用,我是换了个用户测试的。如果在执行储存过程的时候遇到这样的问题,
ERROR 1370 (42000): execute command denied to user 'mysql'@'localhost' for routine 'test.p_test'
解决办法是:grant execute on procedure p_test to 'mysql'@localhost;
由上面的测试数据我们可以看出,autocommit对myisam没有多大的影响。
二,测试autocommit对innodb的影响
1,测试autocommit开启的情况
mysql> alter table test_test type=innodb; //将表改为innodb
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> call p_test(10000); //插入数据
Query OK, 1 row affected (16.32 sec)
mysql> truncate table test_test; //删除数据
Query OK, 0 rows affected (0.02 sec)
我也做了3次测试,都是在16点几秒。myisam插入10000条数据,都不到一秒,而innodb要十几秒,差了20多倍,太杯具了。
2,测试autocommit关闭的情况
mysql> call p_test(10000); //插入数据
Query OK, 1 row affected (0.61 sec)
mysql> commit; //提交
Query OK, 0 rows affected (0.02 sec)
mysql> truncate table test_test; //删除数据
Query OK, 0 rows affected (0.00 sec)
mysql> commit; //提交
Query OK, 0 rows affected (0.00 sec)
我也测试了3次,第一次测试的时候,我以为我只插入了1000条,不然怎么会差距这么大呢。我又测试了二次,测试用时差不多,都是在0.6秒左右。autocommit对innodb的影响太大了,差了快30倍
。我汗
所以我的建议是把mysql的autocommit自动提交功能关闭,这样可以提高mysql的性能,特别是innodb表比较多的情况下,不是提高一点点。如果关闭了autocommit,不要忘了commit。不然mysql服务器挂掉了,或者重起了,数据就丢失了。
分享到:
相关推荐
### MySQL 数据库引擎 MyISAM 与 InnoDB 在 MySQL 数据库系统中,存在多种不同的存储引擎,其中最为人所熟知且广泛使用的两种是 MyISAM 和 InnoDB。这两种存储引擎各自具有独特的特点和适用场景。 #### InnoDB:...
MySQL两种表存储结构MyISAM和InnoDB的性能比较测试 在 MySQL 中,MyISAM 和 InnoDB 是两种主要的表存储结构,它们在性能方面存在着一定的差异。MyISAM 是 MySQL 的默认存储引擎,而 InnoDB 是一种事务安全的存储...
然而,需要注意的是,InnoDB的默认设置在执行大量INSERT或UPDATE操作时,由于每条记录的自动提交(AUTOCOMMIT)会影响性能。可以通过开启BEGIN事务,将多条SQL语句组成一个事务,以提升性能。 在MySQL 4.0及以上...
本次测试主要关注在高容量数据库环境下,MySQL的性能表现,特别是MyISAM与InnoDB两个存储引擎的差异。测试环境为CentOS 5.5 X86操作系统,搭载MySQL 5.1.50版本,并启用了ha_innodb_plugin插件。硬件配置包括Intel(R...
在缺省模式下,MYSQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交, 所以在缺省情况下,mysql 是不支持事务的。 MYSQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的 MYSQL 就 可 以 使 用 事 ...
如果使用InnoDB或BDB表类型,MySQL可以使用事务处理,可以使用SET AUTOCOMMIT命令来设置非autocommit模式。在非autocommit模式下,必须使用COMMIT命令来提交更改,或者使用ROLLBACK命令来回滚更改。 7. MySQL特点 ...
- 全文索引:MyISAM支持全文索引,InnoDB不支持(但在MySQL 5.6及以上版本,InnoDB开始支持全文索引)。 4. **自增主键的行为**: - 如果是MyISAM表,删除记录后,自增ID不会重用,重启后插入新记录ID将是18。 -...
- **存储引擎改进**:对MyISAM、InnoDB等引擎进行了改进,提升了性能和可靠性。 - **复制功能改进**:增强了复制功能,提高了数据同步的效率和准确性。 #### 三、存储引擎特点 - **MyISAM**:适用于读多写少的...
InnoDB是MySQL中的一种存储引擎,与MYISAM不同,InnoDB支持事务处理,并且具有行级锁和外键约束等特性。InnoDB的并发度较高,适合于事务性较高的操作。但使用InnoDB时,必须设置相应的auto_commit标志位。如果不通过...
持久性(Durability):一旦事务成功提交,其对数据库的影响就是永久的,即使数据库出现故障,也能通过日志恢复这些更改。 MySQL 支持事务的存储引擎主要有两种:InnoDB 和 BDB。MyISAM 引擎虽然性能高,但不支持...
在MySQL数据库中,插入数据的速度是衡量数据库性能的关键指标之一。为了提高数据插入的效率,可以采取多种技术手段和优化策略。文档中提到的多种方法可以归纳为以下几类知识点: 1. 利用MySQL的批量插入功能: - ...
- 以上配置项覆盖了性能优化、安全性、日志记录等方面,确保MySQL能够高效稳定地运行。 通过上述步骤,可以完成MySQL的完整安装与配置。这份指南不仅适合初学者,对于想要深入了解MySQL安装细节的技术人员也非常...
MySQL的锁机制对于数据库系统的性能和稳定性起着至关重要的作用。在数据库设计和开发过程中,合理地使用锁策略,能够有效避免死锁现象,提高并发处理能力。接下来,将详细介绍MySQL中的不同类型的锁及其适用场景。 ...
MySQL 数据库在处理大量数据插入时的性能优化是数据库管理员和开发者关注的重要议题。以下是一些针对 MySQL 插入速度提升的关键策略: 1. **批量插入**:在 MyISAM 引擎下,推荐使用 `INSERT INTO table_name ...
- **默认值**: MySQL 5.5.5 版本之前默认为 MyISAM,之后版本默认为 InnoDB。 #### delay-key-write={ON|OFF|ALL} - **定义**: 仅适用于MyISAM表,控制在更新索引后是否立即刷新键缓存。 - **作用范围**: 全局级别...
MySQL提供了完整的事务处理支持,尤其是在使用InnoDB存储引擎时,可以实现ACID(原子性、一致性、隔离性、持久性)事务特性。 #### 事务的基本概念 事务是作为单个逻辑工作单元执行的一系列操作。事务必须满足以下...
事务: 是数据库操作的最小工作...InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。 InnoDB
在当前的数字时代,数据库管理是企业运营不可或缺的部分,其中MySQL作为流行的开源数据库管理系统,它的性能对于各种应用场景至关重要。数据导入是数据库操作中常见的任务,如何提高数据导入MySQL的速度,对于优化...