加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql中怎么达成循环批量插入

发布时间:2022-02-12 22:17:19 所属栏目:MySql教程 来源:互联网
导读:mysql中怎么实现循环批量插入,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 数据结构 寻思着分页时标准列分主键列、索引列、普通列3种场景,所以,测试表需要包含这3种场景,建表
        mysql中怎么实现循环批量插入,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
 
数据结构
 
        寻思着分页时标准列分主键列、索引列、普通列3种场景,所以,测试表需要包含这3种场景,建表语法如下:
 
drop table if exists `test`.`t_model`;
 
Create table `test`.`t_model`(
 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
 `uid` bigint COMMENT '业务主键',
 `modelid` varchar(50) COMMENT '字符主键',
 `modelname` varchar(50) COMMENT '名称',
 `desc` varchar(50) COMMENT '描述',
 primary key (`id`),
 UNIQUE index `uid_unique` (`uid`),
 key `modelid_index` (`modelid`) USING BTREE
) ENGINE=InnoDB charset=utf8 collate=utf8_bin;
为了方便操作,插入操作使用存储过程通过while循环插入有序数据,未验证其他操作方式或循环方式的性能。
 
执行过程
 
1、使用最简单的方式直接循环单条插入1W条,语法如下:
 
drop procedure if exists my_procedure;
delimiter //
create procedure my_procedure()
begin
 DECLARE n int DEFAULT 1;
 WHILE n < 10001 DO
 insert into t_model (uid,modelid,modelname,`desc`) value (n,CONCAT('id20170831',n),CONCAT('name',n),'desc');
 set n = n + 1;
 END WHILE;
end
//               
delimiter ;
插入1W条数据,执行时间大概在6m7s,按照这个速度,要插入1000W级数据,估计要跑几天。
 
2、于是,构思加个事务提交,是否能加快点性能呢?测试每1000条就commit一下,语法如下:
 
delimiter //
create procedure u_head_and_low_pro()
begin
 DECLARE n int DEFAULT 17541;
 WHILE n < 10001 DO
   insert into t_model (uid,modelid,modelname,`desc`) value (n,CONCAT('id20170831',n),CONCAT('name',n),'desc');
   set n = n + 1;
   if n % 1000 = 0
   then
    commit;
   end if;
 END WHILE;
end
//
delimiter ;
执行时间 6 min 16 sec,与不加commit执行差别不大,看来,这种方式做批量插入,性能是很低的。
 
3、使用存储过程生成批量插入语句执行批量插入插入1W条,语法如下:
 
drop procedure IF EXISTS u_head_and_low_pro;
delimiter $$
create procedure u_head_and_low_pro()
begin
 DECLARE n int DEFAULT 1;
 set @exesql = 'insert into t_model (uid,modelid,modelname,`desc`) values ';
 set @exedata = '';
 WHILE n < 10001 DO
 set @exedata = concat(@exedata,"(",n,",","'id20170831",n,"','","name",n,"','","desc'",")");
 if n % 1000 = 0
 then
  set @exesql = concat(@exesql,@exedata,";");
  prepare stmt from @exesql;
  execute stmt;
  DEALLOCATE prepare stmt;
  commit;
  set @exesql = 'insert into t_model (uid,modelid,modelname,`desc`) values ';
  set @exedata = "";
 else
  set @exedata = concat(@exedata,',');
 end if;
 set n = n + 1;
 END WHILE;
end;$$
delimiter ;
关于mysql中怎么实现循环批量插入问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读