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 相关文章推荐
数据库连接池
Apr 06 MySQL
MySQL update set 和 and的区别
May 08 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
MySQL深分页问题解决思路
Dec 24 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检测一个数组有没有定义的方法步骤
2019/07/20 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
jquery实现动态画圆
2014/12/04 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
Python中函数参数调用方式分析
2018/08/09 Python
Python标准库shutil用法实例详解
2018/08/13 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
简历上的自我评价怎么写
2014/01/28 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
MySQL派生表联表查询实战过程
2022/03/20 MySQL