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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL如何构建数据表索引
May 13 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
MySQL索引失效十种场景与优化方案
May 08 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脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
php session_decode函数用法讲解
2019/05/26 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
vue实现简易的双向数据绑定
2020/12/29 Vue.js
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
python中base64加密解密方法实例分析
2015/05/16 Python
Python 中的 else详解
2016/04/23 Python
python读取文件名称生成list的方法
2018/04/27 Python
python中的逆序遍历实例
2019/12/25 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
校园招聘策划书
2014/01/09 职场文书
中职生自荐信范文
2014/06/15 职场文书
求职意向书
2014/07/29 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
新郎答谢词
2015/01/04 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android