MySQL实现批量插入测试数据的方式小结

 更新时间:2023年11月29日 08:25:35   作者:终有救赎  
在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 经常需要一些测试数据, 本文主要介绍了两种常用的MySQL测试数据批量生成方式,希望对大家有所帮助

前言

在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某一知识点经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式

  • 存储方式+函数
  • Navicat的数据生成

一、表

准备了两张表

角色表:

  • id: 自增长
  • role_name: 随机字符串, 不允许重复
  • orders: 1-1000任意数字

用户表:

  • id: 自增长
  • username: 随机字符串, 不允许重复
  • password: 随机字符串, 允许重复
  • role_id: 1-10w之间的任意数字

建表语句:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL COMMENT '用户名',
  `role_id` int(11) DEFAULT NULL COMMENT '角色id',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  `salt` varchar(255) DEFAULT NULL COMMENT '盐',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255) DEFAULT NULL COMMENT '角色名',
  `orders` int(11) DEFAULT NULL COMMENT '排序权重\r\n',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

二、使用函数生成

通过存储过程快速插入, 通过函数保证数据不重复

设置允许创建函数

查看 MySQL是否允许创建函数

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

结果如图所示, 我们使用以下命令将创建函数功能打开(global-所有session都生效)

SET GLOBAL log_bin_trust_function_creators=1; 

这个时候再一次查询就会显示已打开

产生随机字符串

-- 随机产生字符串
DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN    
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
	DECLARE return_str VARCHAR(255) DEFAULT '';
	DECLARE i INT DEFAULT 0;
	WHILE i < n DO  
		SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));  
		SET i = i + 1;
	END WHILE;
	RETURN return_str;
END $$

-- 假如要删除
-- drop function rand_string;

产生随机数字

-- 用于随机产生区间数字
DELIMITER $$
CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN   
 DECLARE i INT DEFAULT 0;  
 SET i = FLOOR(from_num +RAND()*(to_num -from_num+1));
RETURN i;  
END$$

-- 假如要删除
-- drop function rand_num;

三、创建存储过程

插入角色表

-- 插入角色数据
DELIMITER $$
CREATE PROCEDURE insert_role(max_num INT)
BEGIN  
	DECLARE i INT DEFAULT 0;   
	SET autocommit = 0;    
	REPEAT  
		SET i = i + 1;  
		INSERT INTO role ( role_name,orders ) VALUES (rand_string(8),rand_num(1,5000)); 
		UNTIL i = max_num  
	END REPEAT;  
	COMMIT;  
END$$
 
-- 删除
-- DELIMITER ;
-- drop PROCEDURE insert_role;

插入用户表

-- 插入用户数据
DELIMITER $$
CREATE PROCEDURE  insert_user(START INT, max_num INT)
BEGIN  
	DECLARE i INT DEFAULT 0;   
	SET autocommit = 0;    
	REPEAT  
		SET i = i + 1;  
		INSERT INTO user (username, role_id, password, salt ) VALUES (rand_string(8) ,rand_num(1,100000), rand_string(10), rand_string(10));  
		UNTIL i = max_num  
	END REPEAT;  
	COMMIT;  
END$$
 
-- 删除
-- DELIMITER ;
-- drop PROCEDURE insert_user;

四、执行存储过程

-- 执行存储过程,往dept表添加10万条数据
CALL insert_role(100000); 

-- 执行存储过程,往emp表添加100万条数据,编号从100000开始
CALL insert_user(100000,1100000); 

小结

执行用时 10w数据差不多半分钟, 100w数据超过了20分钟, 同时 user的存储还卡死很久…
最后都成功新增, 但是自动递增值和行数不一致, 这个我也不知道因为啥…

数据展示

role表

user表

五、使用 Navicat自带的数据生成

接下来我们使用 Navicat的数据生成

直接下一步, 然后选择对应的两张表生成行数和对应的生成规则, 基于之前的执行速度, 这次 role生成 1w数据, user生成 10w数据

对于字符串类型的字段, 我们可以设置他的随机数据生成器, 根据需要进行选择

例如角色名称, 选择了 职位名称 还可以进行是否包含 null 的选择等

但是如果是 姓名 那么就会让你选择是否唯一

数字的话会让你选择范围, 默认值等

等确定好了, 我们就可以点击右下角进行生成随机测试数据

通过结果可以看到生成十一万测试数据一共用时十一秒, 比第一种方法速度快很多, 推荐使用

以上就是MySQL实现批量插入测试数据的方式小结的详细内容,更多关于MySQL批量插入数据的资料请关注脚本之家其它相关文章!

相关文章

  • Mysql-Insert插入过慢的原因记录和解决方案

    Mysql-Insert插入过慢的原因记录和解决方案

    这篇文章主要介绍了Mysql-Insert插入过慢的原因记录和解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • mysql大批量插入数据的正确解决方法

    mysql大批量插入数据的正确解决方法

    这篇文章主要介绍了mysql大批量插入数据的正确做法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • MySQL MHA集群详解(数据库高可用)

    MySQL MHA集群详解(数据库高可用)

    MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本文介绍MySQL MHA集群(数据库高可用)的相关知识,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • Mysql实战练习之简单图书管理系统

    Mysql实战练习之简单图书管理系统

    由于课设需要做这个,于是就抽了点闲余时间,写了下,用Mysql与Java,基本全部都涉及到,包括借书/还书,以及书籍信息的更新,查看所有的书籍。需要的朋友可以参考下
    2021-09-09
  • 专业级的MySQL开发设计规范及SQL编写规范

    专业级的MySQL开发设计规范及SQL编写规范

    这篇文章主要介绍了专业级的MySQL开发设计规范及SQL编写规范,需要的朋友可以参考下
    2020-11-11
  • mysql数据NULL避坑指南分享

    mysql数据NULL避坑指南分享

    这篇文章主要介绍了mysql数据NULL避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • mysql启动报错:The server quit without updating PID file的几种解决办法汇总

    mysql启动报错:The server quit without updating PID file的几种

    不管是在安装还是运行MySQL的时候,都很有可能遇到报错,下面这篇文章主要给大家介绍了关于mysql启动报错:The server quit without updating PID file的几种解决办法,需要的朋友可以参考下
    2022-08-08
  • MySQL如何查询数据连接方式

    MySQL如何查询数据连接方式

    MySQL支持多种表连接(JOIN)方式,每种方式都有其特定的使用场景和优缺点,以下是 MySQL 中主要的数据连接方式及其特点,有需要的小伙伴可以了解下
    2025-06-06
  • Mysql中常用函数之分组,连接查询功能实现

    Mysql中常用函数之分组,连接查询功能实现

    在MySQL中,函数可以进行各种数据操作,如字符处理、数学计算和日期格式化等,单行函数处理单条数据记录,而分组函数则处理多条数据记录,本文给大家介绍Mysql中常用函数之分组,连接查询功能实现,感兴趣的朋友一起看看吧
    2024-10-10
  • 数据库SQL SELECT查询的工作原理

    数据库SQL SELECT查询的工作原理

    今天小编就为大家分享一篇关于数据库SQL SELECT查询的工作原理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论