mysql 批量插入
来源:互联网 发布:常州java程序员招聘 编辑:程序博客网 时间:2024/05/12 18:25
背景
前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下。测试时没有数据,便安装了一个MySql,建了张表,在建了个while循环批量插入10W条测试数据的时候,执行时间之长无法忍受,便查资料找批量插入优化方法,这里做个笔记。
数据结构
寻思着分页时标准列分主键列、索引列、普通列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循环插入有序数据,未验证其他操作方式或循环方式的性能。
执行过程
- 使用最简单的方式直接循环单条插入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级数据,估计要跑几天。
于是,构思加个事务提交,是否能加快点性能呢?测试每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执行差别不大,看来,这种方式做批量插入,性能是很低的。
- 使用存储过程生成批量插入语句执行批量插入插入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 ;
执行时间 3.308s。
总结
批量插入时,使用insert的values方式批量插入,执行速度大大提升。
阅读全文
1 0
- 【mysql】 mysql批量插入
- mysql批量插入数据
- mysql 批量插入 方法
- mysql批量插入
- mysql批量插入语句
- mysql批量插入数据
- mysql 批量插入问题
- mysql 批量插入
- mysql批量插入
- mysql--批量插入数据
- mysql批量插入
- mysql 批量插入数据
- mysql批量插入测试数据
- MySQL批量插入数据
- mysql批量插入
- mysql批量插入定时器
- mysql批量select插入
- php mysql批量插入
- oracle建表之前删除原表的语句
- java web 文件下载
- ResultSetHandler——DBUtils中封装结果集接口的使用
- 每日一则JavaWeb---ClassLoader原理解析
- 分析500个需求,发现可以年赚30万的蓝海项目
- mysql 批量插入
- webpack--指南1--打包文件配置
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- logback 常用配置详解(二) <appender>
- 前端入门知识.....有关数组的一些方法.....
- 数据库 varchar 和char区别
- Spring MVC 中获取session的几种方法
- SpringBoot入门之HelloWorld(含源码)
- jquery获取json对象的key和value