mysql 循环批量插入的实例代码详解
作者:昔时半夏 时间:2024-01-16 10:28:23
背景
前几天在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循环插入有序数据,未验证其他操作方式或循环方式的性能。
执行过程
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 ;
执行时间 3.308s。
总结
批量插入时,使用insert的values批量方式插入,执行速度大大提升。
以上所述是小编给大家介绍的mysql 循环批量插入的实例代码详解,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/xsbx/archive/2019/05/27/10929069.html
标签:mysql,循环,插入
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SQL Server 比较日期大小的方法
2024-01-22 16:03:03
![](https://img.aspxhome.com/file/2023/5/99955_0s.jpg)
Pycharm最全报错的原因与解决方法总结(推荐!)
2023-10-26 04:20:03
![](https://img.aspxhome.com/file/2023/4/79534_0s.jpg)
如何写python的配置文件
2022-08-06 15:57:09
python中的随机函数小结
2021-07-01 04:26:59
python Manager 之dict KeyError问题的解决
2022-12-17 07:38:09
Centos部署django服务nginx+uwsgi的方法
2022-03-18 07:47:26
javascript 跨域问题以及解决办法
2024-04-23 09:12:16
CSS Sprites + 圆角[译]
2009-05-08 16:10:00
![](https://img.aspxhome.com/file/UploadPic/20095/8/01-11s.jpg)
MySQL的root密码丢失解决方法
2011-05-05 15:56:00
python图片验证码识别最新模块muggle_ocr的示例代码
2021-03-28 11:49:26
基于python中staticmethod和classmethod的区别(详解)
2023-09-30 22:03:32
Layui事件监听的实现(表单和数据表格)
2024-05-09 15:01:11
![](https://img.aspxhome.com/file/2023/3/126873_0s.png)
如何Restore数据库备份文件?
2009-11-02 20:20:00
python网络编程学习笔记(10):webpy框架
2022-07-10 05:43:14
![](https://img.aspxhome.com/file/2023/4/121414_0s.jpg)
python线程安全及多进程多线程实现方法详解
2023-08-27 02:01:54
Oracle 11.2.0.4打补丁的方法
2024-01-13 08:01:26
![](https://img.aspxhome.com/file/2023/1/64471_0s.png)
合理利用页面标签元素有利用搜索引擎收录
2008-11-03 11:49:00
浅谈几种常用的JS类定义方法
2024-04-22 12:56:56
TFRecord文件查看包含的所有Features代码
2023-07-26 15:45:08
oracle 删除重复数据
2009-07-23 14:46:00