使用sql语句往MySQL插入1000万条数据

在学习或者工作生产环境中,我们经常要对数据库进行压力测试,往数据库中批量插入大量数据,这里我往Mysql中批量插入大量数据,采用存储过程的方法实现。
数据库版本:Mysql5.7

一、建表

1、创建数据库(student)
CREATE DATABASE STUDENT;

2、使用数据库
USE STUDENT;
在这里插入图片描述

3、创建学生表(students)
CREATE TABLE students(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
stu_sno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*学号*/
stu_name VARCHAR(20) NOT NULL DEFAULT “”, /*名字*/
stu_age VARCHAR(5) NOT NULL DEFAULT “”, /*年龄*/
stu_date DATE NOT NULL, /*录入日期*/
major VARCHAR(10) NOT NULL DEFAULT “”, /*专业*/
major_sno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*班级编号*/
)ENGINE=INNODB DEFAULT CHARSET=GBK;
在这里插入图片描述

4、创建专业表(majors)
CREATE TABLE majors(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
major_sno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
major VARCHAR(20) NOT NULL DEFAULT “”
)ENGINE=INNODB DEFAULT CHARSET=GBK;
在这里插入图片描述
这里新建了一个学生表和一个专业表,学生表存放了学生的详细信息,包括学号、姓名、年龄等;专业表包括专业名和班级编号,其中学生表中的班级编号是来自专业表。

二、创建函数

1、创建生成名字的函数rand_name()
DELIMITER $$

CREATE FUNCTION rand_name(n INT) RETURNS VARCHAR(255)
BEGIN
DECLARE char_str VARCHAR(255) DEFAULT ‘李王张刘陈杨赵黄周吴徐孙铭胡朱高林何郭马罗文丰浩豪昊皓上官霸元圆婷洪心粱宋郑谢韩唐冯于董萧程曹袁邓许傅沈曾彭吕苏卢蒋蔡贾丁魏薛叶余潘梓智飞宁非光麟霖凌玲灵杜钟田汪陆金朴成崔悦’;
DECLARE return_str VARCHAR(255) DEFAULT ‘’;
DECLARE i INT DEFAULT 0;
WHILE i<n DO
SET return_str=CONCAT(return_str,SUBSTRING(char_str,FLOOR(1+RAND()*52),1));
SET i=i+1;
END WHILE;
RETURN return_str;
END $$

在这里插入图片描述
在mysql中 " ; " 是sql语句结束的标志,但在这里我们要编写函数,因此使用" DELIMITER 符号" 将两个美元符号作为sql语句结束的标志。
这个函数是随机生成姓名的,从预填的汉字中随机抽取指定的汉字的数量进行组合,在日常工作中有个专门的称呼——脱敏,因为这是模拟数据,所以要生成一些模拟名字。

2、创建函数rand_num()
DELIMITER $$

CREATE FUNCTION rand_num() RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i=FLOOR(100+RAND()*10);
RETURN i;
END $$
在这里插入图片描述
这个函数是随机生成数字的函数,指定数字的初始数目和生成的数字多少。

三、创建存储过程

1、students表存储过程
DELIMITER $$

CREATE PROCEDURE insert_students(IN START INT(10),IN max_num INT(11))
BEGIN
DECLARE i INT DEFAULT 0;
#SET autocommit=0 把autocommit设置成0
SET autocommit=0; #把自动提交关掉
REPEAT #重复/循环
SET i=i+1;
INSERT INTO students(stu_sno,stu_name,stu_age,stu_date,major,major_sno)
VALUES((START+i),rand_name(3),‘20’,NOW(),‘软件工程’,rand_num());
UNTIL i=max_num
END REPEAT;
COMMIT;
END $$
在这里插入图片描述

2、创建majors表存储过程
CREATE PROCEDURE insert_majors(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit=0;
REPEAT
SET i=i+1;
INSERT INTO majors(major_sno,major)
VALUES((START+i),‘软件工程’);
UNTIL i=max_num
END REPEAT;
COMMIT;
END $$
在这里插入图片描述

四、测试

1、生成10条专业表数据
DELIMITER ;(这里把sql结束标识符改回来)

CALL insert_majors(100,10);
在这里插入图片描述

2、查看结果
SELECT * FROM MAJORS;
在这里插入图片描述
3、生成1000w条插入数据
CALL insert_students(00000001,10000000);
意思是学号用00000001开始,一直生成1000w条。
在这里插入图片描述
我的笔记本7代i7,实测生成1000w条用时8分54秒。要注意的是存储过程括号的两个数据的含义和数值大小限制。

查看结果:SELECT * FROM STUDENTS;
结果就不展示了,因为Mysql界面跑出1000w条数据需要一段时间,之前测试跑了大概20分钟,图找不着了。

发布了4 篇原创文章 · 获赞 1 · 访问量 1270

猜你喜欢

转载自blog.csdn.net/weixin_43324314/article/details/105358579