mysql autocommit对myisam,innodb的性能影响

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

前段时间把数据库的部分myisam表转变成了innodb了,感觉慢了好多。我知道autocommit对innodb性能有一定的影响,但不知道影响有这么大。如何关闭autocommit,请参考MySQL禁用autocommit,以及遇到的问题 ,为了解决这个问题,我做了一些测试,包括autocommit对myisam,innodb影响。

 

一,测试autocommit对myisam的影响

1,准备测试表和数据

Java代码   收藏代码
  1. mysql>  CREATE TABLE `test_test` (     //测试表  
  2.  ->   `id` int(11) NOT NULL auto_increment,  
  3.  ->   `num` int(11) NOT NULL default '0',  
  4.  ->    PRIMARY KEY  (`id`)  
  5.  ->  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
  6. Query OK, 0 rows affected (0.00 sec)  
  7.   
  8. mysql> delimiter ||  
  9. mysql> create procedure p_test(pa int(11))  
  10.  ->  begin  
  11.  ->  
  12.  ->   declare max_num int(11default 100000;  
  13.  ->   declare i int default 0;  
  14.  ->   declare rand_num int;  
  15.  ->  
  16.  ->   select count(id) into max_num from test_test;  
  17.  ->  
  18.  ->   while i < pa do  
  19.  ->           if max_num < 100000 then  
  20.  ->                   select cast(rand()*100 as unsigned) into rand_num;  
  21.  ->                   insert into test_test(num)values(rand_num);  
  22.  ->           end if;  
  23.  ->           set i = i +1;  
  24.  ->   end while;  
  25.  ->  end||  
  26. Query OK, 0 rows affected (0.03 sec  

 2,测试autocommit开启的情况

Java代码   收藏代码
  1. mysql> call p_test(100000)||        //插入10000条数据  
  2. Query OK, 1 row affected (0.86 sec)  
  3.   
  4. mysql> truncate table test_test;     //清空表  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.   
  7. mysql> optimize table test_test;    //优化一下表,收回资源,确保测试的公平性  

这样我连续做了三次测试,平均一下插入10000的数据差不多要0.86秒 。关于optimize来优化表,请参考optimize table在优化mysql时很重要

3,autocommit关闭的情况下

Java代码   收藏代码
  1. mysql> call p_test(100000)||        //插入10000条数据  
  2. Query OK, 1 row affected (0.83 sec)  
  3.   
  4. mysql> commit;  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.   
  7. mysql> truncate table test_test;     //清空表  
  8. Query OK, 0 rows affected (0.00 sec)  
  9.   
  10. mysql> commit;  
  11. Query OK, 0 rows affected (0.00 sec)  
  12.   
  13. 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开启的情况

Java代码   收藏代码
  1. mysql> alter table test_test type=innodb;          //将表改为innodb  
  2. Query OK, 0 rows affected, 1 warning (0.02 sec)  
  3. Records: 0  Duplicates: 0  Warnings: 1  
  4.   
  5. mysql> call p_test(10000);                       //插入数据  
  6. Query OK, 1 row affected (16.32 sec)  
  7.   
  8. mysql> truncate table test_test;                //删除数据  
  9. Query OK, 0 rows affected (0.02 sec)  

我也做了3次测试,都是在16点几秒。myisam插入10000条数据,都不到一秒,而innodb要十几秒,差了20多倍,太杯具了。

2,测试autocommit关闭的情况

Java代码   收藏代码
  1. mysql> call p_test(10000);                       //插入数据  
  2. Query OK, 1 row affected (0.61 sec)  
  3.   
  4. mysql> commit;                                  //提交  
  5. Query OK, 0 rows affected (0.02 sec)  
  6.   
  7. mysql> truncate table test_test;                //删除数据  
  8. Query OK, 0 rows affected (0.00 sec)  
  9.   
  10. mysql> commit;                                  //提交  
  11. Query OK, 0 rows affected (0.00 sec)  

我也测试了3次,第一次测试的时候,我以为我只插入了1000条,不然怎么会差距这么大呢。我又测试了二次,测试用时差不多,都是在0.6秒左右。autocommit对innodb的影响太大了,差了快30倍 。我汗

所以我的建议是把mysql的autocommit自动提交功能关闭,这样可以提高mysql的性能,特别是innodb表比较多的情况下,不是提高一点点。如果关闭了autocommit,不要忘了commit。不然mysql服务器挂掉了,或者重起了,数据就丢失了。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
存储 算法 关系型数据库
InnoDB与MyISAM实现索引方式的区别
InnoDB和MyISAM均采用B+树索引,但在实现上有所不同。InnoDB的主键索引在叶子节点存储完整数据记录,辅助索引则存储主键值;而MyISAM的主键索引与数据文件分离,仅存数据地址,且主辅索引无区别,支持非唯一主索引。
37 1
|
23天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
2天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
28 7
|
8天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
34 9
|
16天前
|
安全 关系型数据库 数据库
MyISAM和InnoDB的区别
InnoDB支持事务,MyISAM不支持 InnoDB支持外键,MyISAM不支持 InnoDB是聚簇索引,MyISAM是非聚簇索引 InnoDB支持行锁和表锁,MyISAM只支持表锁;【并发情况下,InnoDB性能更牛,默认一锁只会锁住一行数据】 InnoDB不支持全文索引,MyISAM支持 InnoDB支持自增和MVCC模式的读写,MyISAM不支持 InnoDB支持支出数据库异常崩溃后的安全恢复,MyISAM不支持【崩溃后,重启会保证数据恢复到崩溃前状态。这个恢复的过程依赖于redo.log】
|
24天前
|
SQL 关系型数据库 MySQL
MySQL性能探究:count(*)与count(1)的性能对决
在MySQL数据库的性能优化中,对查询语句的细微差别有着深入的理解是非常重要的。`count(*)`和`count(1)`是两种常用的聚合函数,用于计算行数。在面试中,面试官经常会问到这两种函数的性能差异。本文将探讨`count(*)`与`count(1)`的性能对比,并整理十道经典的MySQL面试题,帮助你在面试中游刃有余。
62 3
|
3天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
49 15
|
4天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
8天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
16天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据