陈大剩博客

如何用Mysql的储存过程,新增100W条数据

  • 陈大剩
  • 2021-01-16 11:41:16
  • 1596

什么是存储过程,如何创建一个存储过程

存储过程的英文是 Stored Procedure,它的思想很简单,就是 SQL 语句的封装;
一旦存储过程被创建出来,使用它就像使用函数一样简单;
我们直接通过调用存储过程名即可,存储过程实际上由 SQL 语句和流控制语句共同组成。

CREATE PROCEDURE 存储过程名称 ([参数列表])
BEGIN
    需要执行的语句
END    

 ---使用储存过程
CALL 存储过程名称 ([参数列表]); 

使用Mysql的储存过程,新增100W条数据

--创建表
CREATE TABLE `user`(`user_id` INT UNSIGNED AUTO_INCREMENT,`user_name` VARCHAR(40) NOT NULL,`create_time` DATETIME, PRIMARY KEY ( `user_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建存储过程+事务
CREATE PROCEDURE  `insert_user` (IN START INT(10), IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE date_start DATETIME DEFAULT ('2021-01-16 00:00:00');
DECLARE date_temp DATETIME;
SET date_temp = date_start;
--关闭自动提交
SET autocommit=0;
REPEAT
SET i=i+1;
SET date_temp = date_add(date_temp, interval RAND()*60 second);
INSERT INTO user(user_id, user_name, create_time) VALUES((start+i), CONCAT('user_',i), date_temp);
UNTIL i = max_num
END REPEAT;
COMMIT;
END
--插入数据
CALL insert_user(10000,1000000);

用 date_start 变量来定义初始的注册时间,时间为 2021 年 1 月 16 日 0 点 0 分 0 秒,然后用 date_temp 变量计算每个用户的注册时间,新的注册用户与上一个用户注册的时间间隔为 60 秒内的随机值。然后使用 REPEAT … UNTIL … END REPEAT 循环,对 max_num 个用户的数据进行计算;
在循环前,将 autocommit 设置为 0,这样等计算完成再统一插入,执行效率更高。

注意:

如果你使用 Navicat 这个工具来管理 MySQL 执行存储过程,那么直接执行上面这段代码就可以了;
如果用的是 MySQL,你还需要用 DELIMITER 来临时定义新的结束符;
因为默认情况下 SQL 采用(;)作为结束符,这样当存储过程中的每一句 SQL 结束之后,采用(;)作为结束符,就相当于告诉 SQL 可以执行这一句了;
但是存储过程是一个整体,我们不希望 SQL 逐条执行,而是采用存储过程整段执行的方式,因此我们就需要临时定义新的 DELIMITER,新的结束符可以用(//)或者($$);
如果你用的是 MySQL(指的客户端),那么上面这段代码,应该写成下面这样

--创建表
CREATE TABLE `user`(`user_id` INT UNSIGNED AUTO_INCREMENT,`user_name` VARCHAR(40) NOT NULL,`create_time` DATETIME, PRIMARY KEY ( `user_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建存储过程+事务
DELIMITER $$
CREATE PROCEDURE  `insert_user` (IN START INT(10), IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE date_start DATETIME DEFAULT ('2021-01-16 00:00:00');
DECLARE date_temp DATETIME;
SET date_temp = date_start;
--关闭自动提交
SET autocommit=0;
REPEAT
SET i=i+1;
SET date_temp = date_add(date_temp, interval RAND()*60 second);
INSERT INTO user(user_id, user_name, create_time) VALUES((start+i), CONCAT('user_',i), date_temp);
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$
DELIMITER ;
--插入数据
CALL insert_user(10000,1000000);
分享到:
0

说点儿什么吧

头像

表情

本站由陈大剩博客程序搭建 | 湘ICP备17009938号| Copyright © 2017 - 陈大剩博客 | 本站采用创作共用版权:CC BY-NC 4.0

站长统计| 文章总数[31]| 评论总数[12]| 登录用户[21]| 时间点[33]

登入

社交账号登录