MySQL批量插入优化

2023-05-16

前面介绍了MySQL批量插入可以通过存储过程的方式来实现,这里介绍批量插入100W记录,并做一个优化。

建表语句:create_table.sql

drop table if exists xx_user;
create table xx_user(
id int primary key auto_increment,
name varchar(20),
age int);

直接插入:proc.sql

delimiter //
drop procedure if exists add_user;
create procedure add_user()
begin
declare i int default 0;
set i=0;
while i<=1000000 do 
  set i=i+1;
  insert into xx_user(name,age) values (concat('user-',i),20);
end while;
end;
//
delimiter ;

默认情况下,直接调用生成的存储过程,批量插入100w条记录,耗时如下:

这种循环单条记录插入的方式建议不要直接操作,非常耗时。 

多values插入:batch.sql

drop procedure if exists batch_insert;
delimiter //
create procedure batch_insert()
begin
    declare i int;
    set i = 0;
    set @sqlstr='insert into xx_user(name,age) values ';
    while i<=1000000 do
      set i=i+1;
      set @sqlstr=concat(@sqlstr,'(concat(''user-'',',i,'),18)');
      if mod(i,5000)=0 then
         prepare stmt from @sqlstr;
         execute stmt;
         deallocate prepare stmt;
         set @sqlstr='insert into xx_user(name,age) values ';
      else
         set @sqlstr=concat(@sqlstr,',');
      end if;
   end while;
end;
//
delimiter ;

这个是利用了多个values批量插入的办法,速度明显要高于第一种循环单条记录插入的办法,如下图所示,时间缩短到接近90秒:

 

优化参数:

set global bulk_insert_buffer_size=104857600;
set session autocommit=off;
set session unique_checks=off; 

当使用以上优化之后,第一个循环插入单条记录的办法,速度提升的惊人,效果如下,时间接近60秒:

当我们利用优化后的环境进行多values批量插入测试,发现速度并没有明显的改变。如下所示:

这个速度接近于90秒,和不做参数修改时差不多。

以上两个插入对比,如果不修改参数的情况下,多values批量插入的办法比普通循环插入的效率要高很多,如果更改了环境变量参数,那么普通循环插入单条记录的效率提升非常快,甚至超过了多values批量插入的效率。

一般而言,如果修改了autocommit,unique_checks为off,那么需要在批量插入之后,将变量值修改回来。比如:

set session autocommit=on;
set session unique_checks=on;

根据很多建议修改bulk_insert_buffer_size大小,默认是8m即8388608,修改为100m,即104857600,无论是循环插入单条记录,还是多values插入,均没有明显的提升效率,所以这里并没有特别的介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL批量插入优化 的相关文章

随机推荐

  • 使用jQuery中Deferred异步对象构建顺序执行队列

    在前面 xff0c 有一篇文章介绍了jQuery的异步对象Deferred xff0c 通过他 xff0c 我们可以实现一些操作比如回调函数在异步操作 xff08 耗时 xff09 完成之后再执行 比如这样的场景 xff0c 我们在编辑页面
  • nodejs路由之代码分离

    nodejs提供了路由功能 xff0c 解决客户端各类请求对应的处理问题 xff0c 相当于springboot开发各个controller对应的方法 xff0c nodejs提供的路由 xff0c 也支持各种方法 xff1a get po
  • gcc编译c++文件

    gcc是编译c语言的 xff0c 默认情况下 xff0c 如果直接编译c 43 43 程序 xff0c 会报错 xff1a root 64 server demo2 ls hello cpp root 64 server demo2 cat
  • linux下C++连接mysql查询数据

    windows下使用C 43 43 连接mysql相对繁琐 xff0c 这里直接在linux下通过C 43 43 连接mysql xff0c 执行查询操作 linux下连接mysql xff0c 需要本机有libmysqlclient库文件
  • linux下C++连接redis

    linux下c 43 43 连接redis 需要安装redis 同时还需要安装hiredis xff0c hiredis是c 43 43 操作redis的api库 redis的安装这里不介绍了 xff0c 很多教程 这里直接从hiredis
  • sqlite3简单入门

    linux上一般默认是自带了sqlite3的 xff0c 所以学习sqlite3 xff0c 最好使用linux 这样可以跳过安装这一步 开始 xff0c 我们可以直接运行sqlite3 testsqlite3 db databases 可
  • linux下C++连接sqlite3

    linux下 xff0c c 43 43 连接sqlite3 xff0c 不需要额外的安装依赖库 xff0c linux自带了sqlite3 xff0c 在编译的时候 xff0c 只需要将sqlite3的库加入编译参数中即可 sqlite3
  • mongodb查询两个字段做加减乘除操作

    和使用关系型数据库一样 xff0c 我们在使用mongodb的时候 xff0c 我们希望有这样的操作 xff0c 就是查询两个字段的乘积或者和 xff0c 这就需要用到聚合查询了 xff0c 聚合查询的语法大致如下 xff1a db use
  • mongodb副本集oplogSize设置过小的问题

    mongodb副本集构建的高可用方案 xff0c 最少需要三个节点 xff0c 一个主节点master xff0c 一个从节点slave xff0c 一个选举仲裁节点arbiter 当主节点奔溃的时候 xff0c 仲裁节点选举从节点来接替主
  • mongodb开启安全认证

    默认 xff0c mongodb不开启安全认证 xff0c 通过mongo shell访问 xff0c 我们会看到mongo shell报出警告 xff1a 后面两个警告很好解决 xff1a 按照提示 xff0c 我们修改 sys kern
  • CCF-201809-3-元素选择器

    题目很长 xff0c 大家自行去官网看 第三题还是一如既往的是大模拟 xff0c 模拟css元素选择器 xff0c 有接触过前端的同学对此不陌生了吧 以前学css的时候就想过层叠样式表的实现 xff0c 但是也没细究 ccf第三题有出过ma
  • hbase shell命令行下常见操作

    hbase是基于hadoop的列簇数据库 xff0c 是nosql的一种 当我们搭建了hbase环境之后 xff0c 可以通过hbase shell命令 xff0c 进入hbase的命令行下 xff0c 可以进行创建表 xff0c 添加数据
  • redis高可用sentinel哨兵模式环境搭建

    redis高可用需要保证 xff0c 在主节点崩溃的时候 xff0c 从节点能够成为主节点 xff0c 继续提供服务 默认来说主从模式master slave就能做到这一点 xff0c 但是在实际环境中 xff0c 客户端连接的是指定的主机
  • win7笔记本电脑设置WiFi热点

    一般情况下 xff0c 我们是利用路由器设置WiFi热点 xff0c 但是如果没有路由器 xff0c 而有网线 xff0c 我们可以利用笔记本电脑来设置WiFi热点 xff0c 这里介绍如何通过笔记本电脑连接网线设置WiFi热点 笔记本电脑
  • 脚本之家上的一道题:如何通过findstr查找80和443端口记录

    一般来说 xff0c 我们都是在linux上编写bash脚本 xff0c 如果是在windows系统上 xff0c 我们就需要编写批处理脚本bat来处理相关业务逻辑 脚本之家上有这么一道题 xff1a 需要找到80 443端口的记录 xff
  • scylladb:利用java api操作scylladb数据库

    博客上全是关于scylladb的介绍和性能对比 xff0c 很少有scylladb方面的干货 xff0c 这里从scylladb官网各种文档里面整合出一个java版的例子 xff0c 例子中展示如何连接scylladb xff0c 如何加载
  • scylladb:设置监听主机IP为非默认localhost

    前面介绍了通过scylladb提供的driver xff0c 编写java代码 xff0c 然后操作scylladb数据库 但是因为scylladb默认采用的监听地址是localhost即127 0 0 1 xff0c 如果想从外部连接sc
  • mysql修改记录时update 字段=字段+字符串

    在有些场景下 xff0c 我们需要对我们的varchar类型的字段做修改 xff0c 而修改的结果为两个字段的拼接或者一个字段 43 字符串的拼接 如下所示 xff0c 我们希望将xx role表中的name修改为name 43 id 在m
  • MySQL存储过程入门

    存储过程是一种在数据库中存储复杂程序 xff0c 以便外部程序调用的一种数据库对象 存储过程是为了完成特定功能的SQL语句集 xff0c 经编译创建并保存在数据库中 xff0c 用户可以通过指定存储过程的名字并给定参数来调用执行 存储过程思
  • MySQL批量插入优化

    前面介绍了MySQL批量插入可以通过存储过程的方式来实现 xff0c 这里介绍批量插入100W记录 xff0c 并做一个优化 建表语句 xff1a create table sql drop table if exists xx user