MySQL生成千万测试数据以及遇到的问题


Posted in MySQL onAugust 05, 2022

1、创建基础表结构

CREATE TABLE `t_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c_user_id` varchar(36) NOT NULL DEFAULT '',
 `c_name` varchar(22) NOT NULL DEFAULT '',
 `c_province_id` int(11) NOT NULL,
 `c_city_id` int(11) NOT NULL,
 `create_time` datetime NOT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_user_id` (`c_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2、创建内存表

直接往实表添加数据比较慢,所以我们先插入内存表,然后再同步到实表。

CREATE TABLE `t_user_memory` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c_user_id` varchar(36) NOT NULL DEFAULT '',
 `c_name` varchar(22) NOT NULL DEFAULT '',
 `c_province_id` int(11) NOT NULL,
 `c_city_id` int(11) NOT NULL,
 `create_time` datetime NOT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_user_id` (`c_user_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;

3、创建存储过程和函数

# 创建随机字符串
delimiter $$
CREATE DEFINER = `root` @`%` FUNCTION `randStr` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGIN
	DECLARE
		chars_str VARCHAR ( 100 ) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	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() * 62 ), 1 ));
		
		SET i = i + 1;
		
	END WHILE;
	RETURN return_str;
	
	END $$ 
# 创建随机时间的函数,sd和ed两个入参代表生成的时间是这个时间范围内的。sd开始时间,ed截止时间。	
CREATE DEFINER = `root` @`%` FUNCTION `randDataTime` ( sd DATETIME, ed DATETIME ) RETURNS datetime DETERMINISTIC BEGIN
	DECLARE
		sub INT DEFAULT 0;
	DECLARE
		ret DATETIME;
	
	SET sub = ABS(
	UNIX_TIMESTAMP( ed )- UNIX_TIMESTAMP( sd ));
	
	SET ret = DATE_ADD( sd, INTERVAL FLOOR( 1+RAND ()*( sub - 1 )) SECOND );
	RETURN ret;

END $$ 

# 创建插入数据存储过程
CREATE DEFINER = `root` @`%` PROCEDURE `add_t_user_memory` ( IN n INT ) BEGIN
	DECLARE
		i INT DEFAULT 1;
	WHILE
			( i <= n ) DO
			INSERT INTO t_user_memory ( c_user_id, c_name, c_province_id, c_city_id, create_time )
		VALUES
			(
				uuid(),
				randStr ( 20 ),
				FLOOR( RAND() * 1000 ),
				FLOOR( RAND() * 100 ),
				randDataTime ( "2020-01-01", "2021-01-01" ));
		

		SET i = i + 1;
		
	END WHILE;

END $$
delimiter ;

4、执行存储过程

存储过程当中的数字就是要生成的数量,自行填写。

CALL add_t_user_memory(10);

100万大概需要8分钟!

MySQL生成千万测试数据以及遇到的问题

5、遇到的问题

创建存储过程和执行的时候可能会出现以下两种问题:

5.1、1449错误

在创建存储过程的时候可能会出现1449:错误:

mysql 1449 : The user specified as a definer (‘root’@‘%’) does not exist

经查询是权限问题,解决办法:

运行sql:

grant all privileges on *.* to 'root'@'%' identified by ".";
flush privileges;

5.2、1114错误

当生成数量大的时候就可能会报这个错误:

MySQL生成千万测试数据以及遇到的问题

解决方法:在my.cnf中修改max_heap_table_size = 256M tmp_table_size = 256M,重启MySQL服务(my.cnf在mysql安装路径),如果还不够用根据自己电脑自行修改。如果是线上服务器,最好不要自行修改,还是跟运维多沟通沟通,避免出现问题。

MySQL生成千万测试数据以及遇到的问题

show VARIABLES like '%TABLE_size%';

改完可以在这进行查看:

MySQL生成千万测试数据以及遇到的问题

6、同步数据

INSERT INTO t_user SELECT * FROM t_user_memory;

总结

到此这篇关于MySQL生成千万测试数据以及遇到的问题的文章就介绍到这了,更多相关MySQL生成千万测试数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL如何构建数据表索引
May 13 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
MySQL创建管理子分区
Apr 13 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
面试官问我Mysql的存储引擎了解多少
MySQL索引失效场景及解决方案
Jul 23 #MySQL
MySQL添加索引特点及优化问题
Jul 23 #MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 #MySQL
MySQL分布式恢复进阶
Jul 23 #MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 #MySQL
MySQL池化框架学习接池自定义
Jul 23 #MySQL
You might like
PHP中的float类型使用说明
2010/07/27 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
js下用层来实现select的title提示属性
2010/02/23 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
javascript连续赋值问题
2015/07/08 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python中 map()函数的用法详解
2018/07/10 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
公务员培训自我鉴定
2013/09/19 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
中秋晚会活动方案
2014/08/31 职场文书
2015年司法所工作总结
2015/04/27 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js