MySQL优化之提高插入效率(全局关闭autocommit)

写在前面

近来做mysql的导入时,发现插入速度极慢。5W多条数据要花半个小时,难以忍受。在网上查阅资料,总结出来这个方法。 即 关闭Mysql的自动提交 因为我是qt+mysql 配合使用,所以需要全局关闭。关闭后插入5W多条数据只需要29S


MySQL默认的数据提交操作模式是自动提交模式(autocommit)。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。
这里写图片描述
Mysql的InnoDB存储引擎支持事务处理。InnoDB表引擎下关闭mysql自动事务提交可以大大提高数据插入的效率,这是因为如果需要插入1000条数据,mysql会自动发起(提交)1000次的数据写入请求,如果把autocommit关闭掉,通过程序来控制,只要一次commit就可以搞定,这是会大大提高速率。关闭后如下图
这里写图片描述
所以说应该将存储引擎改为InnoDB,具体方法不做讲述。
首先查询当前数据库事务提交方式的命令为:
show variables like "autocommit"
查询结果如下(如果是off 就可以关闭这篇文章了)
这里写图片描述

下面说一下具体操作方法

  • 更改配置文件
    在MySQL的安装根目录下 找到my.ini .使用记事本打开,在[mysqld] 后面加入**init_connect=‘SET autocommit=off’ ** 如果没有my.ini 请新建一个记事本 把图片的内容输入进去,并更改名字。
    这里写图片描述
    这里写图片描述
  • 重新启动mysql服务
    打开管理员模式的cmd输入
net stop MySQL

net start MySQL

  • 创建子权限用户
    这一步是因为 当我们以Super权限(root)登录mysql数据库服务时,show variables like '%autocommit%'查得结果还是:autocommit ON,这是因init_connect(手册中有对其解释)以Super用户登录是不被加载的,这是mysql出于安全考虑,而后用普通用户登录,show variables like ‘%autocommit%’ 显示的结果如下:autocommit OFF。

    所以我们就登陆root 创建一个用户 授予他你想操作数据库的权限。使用该用户登陆MySQL即可。

mysql -uroot -p   //登陆root账户 输入完毕后按两下回车
CREATE USER 'tomato'@'localhost' IDENTIFIED BY '123456'; //三个单引号内容 用户名 端口号 密码
GRANT [ALL] ON [cg].[*] TO ‘tomato’@’localhost’; // 实际输入没有[] 为了方便解释才采用
// 第一个为权限名 all是所有权限  第二个是数据库名  第三个 *代表cg数据库的所有表  

避免长事务

将autocommit设置为0 很容易导致长事务的产生。
而长事务会存在很多潜在风险,且会占用磁盘资源。

mysql的事务启动方式有以下几种:

  1. 显式启动事务语句,begin start transaction 配套的commit 回滚语句roll back。
  2. set autocommit=0.这个命令会将这个线程的自动提交关闭。意味着执行一个select语句的时候,事务就启动了,并且不自动提交。知道主动执行commit或者rollback,或者断开连接。
    使用第二种方式会导致长事务。
    所以建议显式指定begin和commit。

另外 begin 后 输入 commit work and chain 会提交当前事务,开启下一次事务。

可以通过

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

查询持续时间超过60s的事务。


到此为止我们就大功告成了,去试试此时插入的速度把。
还有一个记录了mysql优化插入的博客

https://blog.csdn.net/u013707844/article/details/24694823

参考文章:https://blog.csdn.net/rl529014/article/details/79451381
用了人家的图哈哈哈!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 DB2 存储过程中插入大量数据时,可以采取以下几种方式来提高效率: 1. 使用批量插入:使用 INSERT INTO SELECT 语句结合 VALUES 子句,一次性插入多行数据。这比逐行插入效率更高。 2. 使用临时表:可以先将数据插入到临时表中,然后通过 INSERT INTO SELECT 语句将数据从临时表中插入到目标表中。这种方式可以减少对目标表的锁定时间,提高并发性能。 3. 禁用日志记录:在插入大量数据时,可以考虑临时禁用日志记录,以提高性能。可以使用以下命令禁用日志记录:SET INTEGRITY FOR 表名 IMMEDIATE CHECKED FORCE GENERATED;插入完成后,记得重新启用日志记录。 4. 调整提交频率:默认情况下,DB2 在每次插入操作后都会自动提交事务,这会导致频繁的日志写入和锁定。可以通过设置 AUTOCOMMIT 为 OFF,在插入完成后手动提交事务,减少提交的次数,提高效率。 5. 调整数据库配置参数:根据实际情况,可以调整 DB2 的数据库配置参数来优化插入性能。例如,可以调整 LOGFILSIZ、LOGBUFSZ、LOCKLIST、SORTHEAP 等参数。 6. 使用并行插入:如果插入操作可以并行执行,可以考虑使用并行插入提高效率。可以通过设置数据库配置参数 MAX_COORDAGENTS 和 MAX_QUERYDEGREE 来控制并行度。 需要根据具体的业务场景和环境进行测试和调优,以找到最适合的提高插入效率的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值