mysql中怎么实现循环批量插入,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

数据结构

寻思着分页时标准列分主键列、索引列、普通列3种场景,所以,测试表需要包含这3种场景,建表语法如下:

droptableifexists`test`.`t_model`;Createtable`test`.`t_model`(`id`bigintNOTNULLAUTO_INCREMENTCOMMENT'自增主键',`uid`bigintCOMMENT'业务主键',`modelid`varchar(50)COMMENT'字符主键',`modelname`varchar(50)COMMENT'名称',`desc`varchar(50)COMMENT'描述',primarykey(`id`),UNIQUEindex`uid_unique`(`uid`),key`modelid_index`(`modelid`)USINGBTREE)ENGINE=InnoDBcharset=utf8collate=utf8_bin;

为了方便操作,插入操作使用存储过程通过while循环插入有序数据,未验证其他操作方式或循环方式的性能。

执行过程

1、使用最简单的方式直接循环单条插入1W条,语法如下:

dropprocedureifexistsmy_procedure;delimiter//createproceduremy_procedure()beginDECLAREnintDEFAULT1;WHILEn<10001DOinsertintot_model(uid,modelid,modelname,`desc`)value(n,CONCAT('id20170831',n),CONCAT('name',n),'desc');setn=n+1;ENDWHILE;end//               delimiter;

插入1W条数据,执行时间大概在6m7s,按照这个速度,要插入1000W级数据,估计要跑几天。

2、于是,构思加个事务提交,是否能加快点性能呢?测试每1000条就commit一下,语法如下:

delimiter//createprocedureu_head_and_low_pro()beginDECLAREnintDEFAULT17541;WHILEn<10001DOinsertintot_model(uid,modelid,modelname,`desc`)value(n,CONCAT('id20170831',n),CONCAT('name',n),'desc');setn=n+1;ifn%1000=0thencommit;endif;ENDWHILE;end//delimiter;

执行时间 6 min 16 sec,与不加commit执行差别不大,看来,这种方式做批量插入,性能是很低的。

3、使用存储过程生成批量插入语句执行批量插入插入1W条,语法如下:

dropprocedureIFEXISTSu_head_and_low_pro;delimiter$$createprocedureu_head_and_low_pro()beginDECLAREnintDEFAULT1;set@exesql='insertintot_model(uid,modelid,modelname,`desc`)values';set@exedata='';WHILEn<10001DOset@exedata=concat(@exedata,"(",n,",","'id20170831",n,"','","name",n,"','","desc'",")");ifn%1000=0thenset@exesql=concat(@exesql,@exedata,";");preparestmtfrom@exesql;executestmt;DEALLOCATEpreparestmt;commit;set@exesql='insertintot_model(uid,modelid,modelname,`desc`)values';set@exedata="";elseset@exedata=concat(@exedata,',');endif;setn=n+1;ENDWHILE;end;$$delimiter;

关于mysql中怎么实现循环批量插入问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。